1. 程式人生 > >SQL行轉列PIVOT關鍵字的用法

SQL行轉列PIVOT關鍵字的用法

昨天寫報表遇到行轉列,原來都是使用動態sql來實現,這次嘗試使用了下pivot來實現,pivot是sql server2005後加入的關鍵字,它使用起來比較方便,比起動態sql會簡化很多。

基本語法:select 列1,[A],[B],[C]... from table pivot (聚合函式(列1) for 列2 in ([A],[B],[C]......)) as t

例1:

1.資料準備

CREATE TABLE #profit
(Yer_mon VARCHAR(20),
 dep_nam VARCHAR(20),
 prf_amt INT
)

INSERT INTO #profit( Yer_mon, dep_nam, prf_amt )VALUES ( '201301', '深圳分行', 10 )
INSERT INTO #profit( Yer_mon, dep_nam, prf_amt )VALUES ( '201301', '北京分行', 20 )
INSERT INTO #profit( Yer_mon, dep_nam, prf_amt )VALUES ( '201302', '上海分行', 5 )
INSERT INTO #profit( Yer_mon, dep_nam, prf_amt )VALUES ( '201303', '深圳分行', 20 )
INSERT INTO #profit( Yer_mon, dep_nam, prf_amt )VALUES ( '201303', '廣州分行', 50 )

SELECT * FROM #profit

Yer_mon              dep_nam              prf_amt
-------------------- -------------------- -----------
201301               深圳分行                 10
201301               北京分行                 20
201302               上海分行                 5
201303               深圳分行                 20
201303               廣州分行                 50


下面我們將Yer_mon列中的內容轉為列名,sql:

SELECT  dep_nam ,[201301] ,[201302] ,[201303]
FROM    #profit PIVOT ( SUM(prf_amt) FOR Yer_mon IN ( [201301],[201302],[201303] ) ) AS t

輸出:

dep_nam              201301      201302      201303
--------------------     -----------     -----------     -----------
北京分行                 20              NULL         NULL
廣州分行                 NULL        NULL         50
上海分行                 NULL        5                  NULL
深圳分行                 10              NULL          20


注意:1.pivot行轉列中展示列必須使用聚合函式,如:sum、avg、count、max、min等;

2.pivot處理的列其實就相當於一個數據表,這裡必須給它加上別名;

問:如果我們要轉的列內容是日期型別或者字串型別怎麼辦?這個時候可以使用max或者min函式巧妙的達到我們的目的,請看下面這個例子:

例2:

我們這裡有張表#t:

SaleServiceGUID                                                    ServiceProc                    CompleteDate
------------------------------------                                     ------------------------------ -----------------------
002DBBDD-7C90-4F62-8071-00749D89BA03 到訪日期                           2012-12-25 
002DBBDD-7C90-4F62-8071-00749D89BA03 未辦理                            2012-06-06 
002DBBDD-7C90-4F62-8071-00749D89BA03 入夥日期                           2012-12-25 
002DBBDD-7C90-4F62-8071-00749D89BA03 已辦理產權                          2013-04-29 
002DBBDD-7C90-4F62-8071-00749D89BA03 物業費起計時間                        2013-02-01 
A31087ED-27B1-422A-BEB2-057B87FA6782 物業費起計時間                        2013-10-01 
A31087ED-27B1-422A-BEB2-057B87FA6782 入夥日期                           2013-07-03 
A31087ED-27B1-422A-BEB2-057B87FA6782 到訪日期                           2013-07-03 
A31087ED-27B1-422A-BEB2-057B87FA6782 未辦理                            2012-12-29 

我們要把ServiceProc轉為列名,資料內容是欄位CompleteDate,在已知列數情況下我們可以這樣寫:

SELECT SaleServiceGUID,[未辦理],[到訪日期],[入夥日期],[物業費起計時間],[已辦理產權] 
FROM #t PIVOT ( MAX(CompleteDate) FOR ServiceProc IN ([未辦理],[到訪日期],[入夥日期],[物業費起計時間],[已辦理產權])) AS t

輸出:

SaleServiceGUID                                                     未辦理                     到訪日期               入夥日期                物業費起計時間   已辦理產權
------------------------------------                                     ----------------------- ----------------------- ----------------------- ----------------------- -----------------------
002DBBDD-7C90-4F62-8071-00749D89BA03 2012-06-06          2012-12-25          2012-12-25           2013-02-01          2013-04-29 
A31087ED-27B1-422A-BEB2-057B87FA6782  2012-12-29           2013-07-03          2013-07-03           2013-10-01          NULL

注意:這裡我們使用了max聚合函式來取日期欄位,同理如果是字串型別的資料也可以使用這種寫法。

相關推薦

SQLPIVOT關鍵字用法

昨天寫報表遇到行轉列,原來都是使用動態sql來實現,這次嘗試使用了下pivot來實現,pivot是sql server2005後加入的關鍵字,它使用起來比較方便,比起動態sql會簡化很多。 基本語法:select 列1,[A],[B],[C]... from table p

SQL(PIVOT)與轉行(UNPIVOT)簡明方法

數量 ref 統計 logs pan when 可擴展 南方 float 原文地址:https://www.cnblogs.com/linJie1930906722/p/6036714.html 在做數據統計的時候,行轉列,列轉行是經常碰到的問題。case when方式太

sql(PIVOT)與轉行(UNPIVOT)

列轉行 gif 而且 碼農 實現 score username info rect 在做數據統計的時候,行轉列,列轉行是經常碰到的問題。case when方式太麻煩了,而且可擴展性不強,可以使用 PIVOT,UNPIVOT比較快速實現行轉列,列轉行,而且可擴展性強

Oracle pivot轉行unpivot 的Sql語句總結

多行轉字串 這個比較簡單,用||或concat函式可以實現 print? 1.  select concat(id,username) str from app_user   2.     3.  select id||username str from app_use

Oracle pivot函式基本用法

2018年9月30日22點,眼看著就10月份了,回頭看下,8月份就寫了一篇部落格,9月一篇都沒寫,想著還是得續一續。 剛好前幾天,幫一個群友處理了一個關於Oracle中行轉列,根據查詢中有的專案,動態轉列的做法。想著也挺好玩,不過看下時間,不太充足。所以暫時先寫個Oracl

sql 使用pivot

SELECT * from   ( SELECT     商品名稱,銷售數量,月份 FROM tb_helenzhou ) as t1----被行轉列的欄位先在這裡列出來  PIVOT  (SUM(銷售數量) FOR 月份 IN ([1], [2]) ) as t2-

SQL

png 英語 姓名 create case when src clas 行轉列 序號 一、使用場景   當系統中有匯總和明細的需求時,一般通過SQL來實現,匯總 就是 根據條件顯示出全部的數據,明細 就是 一條匯總對應的詳細信息。   行轉列通常用於實現明細的時候。

T-sql ,數據庫查詢分頁

tput substr between dep and alt rom img lec 1 USE [APS_Future_FT] 2 GO 3 /****** Object: StoredProcedure [dbo].[A_CrudePrice] Scr

SQL經典例子(轉載)

htm har server2 str union sdn ltrim sql ue4 行轉列問題總結 1、行轉列 ---1、最簡單的行轉列 /* 問題:假設有張學生成績表(tb)如下: 姓名 課程 分數 張三 語文 74 張三 數學 83 張三 物理 93 李

Sql的兩個小例子

SQL行轉列 所謂行轉列就是將某一個category型別的列(nx1的矩陣,實質是有m類),目標是將多行轉換成為多列(新增m列)。 例1:模擬順豐SQL小例子 ##順豐面試題(SQLite編碼實現題目) import sqlite3 conn=sqlite3.con

sql 並更改列名(實際應用並截圖)

這裡是一個實際應用的例子,一開始的資料是錯綜複雜的,如下圖所示,實際很多月份很多的型別,需要的是得到每個部門不同了型別不同月份的實際金額,這兒就用到了行轉列的寫法,百度了一下確實有效,成功之後的顯示欄位確實1,2,3,4....這種的,最好變為january,february...的這種所以就用了宣

SQL:decode函式

  前言   開發中我們經常會用到行轉列,這裡記錄一下我在專案中實現行轉列的思路。需求:報表模組,統計某機房機架的不同狀態(1 空閒  2 預佔  3 佔用)的數量(真實需求更為複雜,這裡只是討論技術,簡化一下)     decode函式   以下介紹摘自百度百科:  

SQL的動態構造方法

SQL行轉列的動態構造方法 /*假設有張學生成績表(tb)如下: 姓名 課程 分數 張三 語文 74 張三 數學 83 張三 物理 93 李四 語文 74 李四 數學 84 李四 物理 94 想變成(得到如下結果): 姓名 語文 數學 物理 ---- ---- ---- ---- 李四 74 8

oracle 11g下的pivot填坑--xmlTypeclob或String

臨近年關,我們給全公司用的API平臺也到了要裝逼的時刻,然而裝逼利器還沒搞完,那就是報表呈現,於是leader說你來搞一下吧。 echarts肯定是要的,報表呈現還是很完美的。然後就是資料庫層面的了。我們裝的是oracle 11g,這貨提供了pivot來進行轉列,然而它是有坑的,本次記錄的就是這個。 pi

SQL

when sel student sco select score The sele then 1 select * from Score 1 select student, 2 sum(case course when ‘語文‘ then score end) a

[SQL]轉行

1、測試資料集 username subject score 1 張三 語文 80 2 張三 數學 90 3 張三 生物 85 4 李四 語文 80 5

使用case when,union all實現sql轉行

-- 建表 CREATE TABLE StudentScores ( UserName NVARCHAR(20), -- 學生姓名 Subject

SQL 轉行

先準備點資料: CREATE TABLE Sell ( [Year] INT, [Quarter] NVARCHAR(10), Quantity INT ) GO INSERT INTO

Mysql-sql

原始資料如下圖所示:(商品的銷售明細)date=業務日期;Item=商品名稱;saleqty=銷售數量 -- 建立測試資料(表)create table test (Date varchar(10), item char(10),saleqty int);insert test values('2010

sql轉行

最近建立資料立方體需要將表的資料結構進行轉換,進行列轉行,覺得用途還很大,所以就整理一下,當做自己的筆記拉。 1、列轉行(主要) 表weatherdata結構: create table WEATHERDATA ( 路徑 VARCHAR2(100), 日期