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聚合函式來取日期欄位,同理如果是字串型別的資料也可以使用這種寫法。
相關推薦
SQL行轉列PIVOT關鍵字的用法
昨天寫報表遇到行轉列,原來都是使用動態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填坑--xmlType轉clob或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), 日期