1. 程式人生 > >使用pivot和unpivot語句實現行轉列,列轉行

使用pivot和unpivot語句實現行轉列,列轉行

在做報表時,經常需要將資料表中的行轉列,或者列轉行,如果不知道方法,你會覺得通過SQL語句來實現非常難。這裡,我將使用pivot和unpivot來實現看似複雜的功能。

引用MSDN:
可以使用 PIVOT 和 UNPIVOT 關係運算符將表值表示式更改為另一個表。PIVOT 通過將表示式某一列中的唯一值轉換為輸出中的多個列來旋轉表值表示式,並在必要時對最終輸出中所需的任何其餘列值執行聚合。UNPIVOT 與 PIVOT 執行相反的操作,將表值表示式的列轉換為列值,但是在實際應用中,有些聚合之後的資料很難進行拆分。所以呢,unpivot並非pivot的逆過程。


pivot 提供的語法比一系列複雜的 SELECT...CASE 語句中所指定的語法更簡單和更具可讀性。
使用SELECT...CASE語句進行行轉列的方法見:解析SQL Server中行轉列問題


簡單的例子如下:
---------行轉列
create table test(編號 int,姓名 varchar(20),季度 int,銷售額 int) 
insert into test values(1,'simon',1,1000);
insert into test values(1,'simon',2,2000);
insert into test values(1,'simon',3,3000);
insert into test values(1,'simon',4,4000);
insert into test values(2,'meme',1,5000);
insert into test values(2,'meme',2,6000);
insert into test values(2,'meme',3,7000);
insert into test values(2,'meme',4,8000);


select * from test;
select 編號,姓名,[1] as "一季度",[2] as "二季度",[3] as "三季度",[4] as "四季度",[5] as "隨便1" from test pivot(sum(銷售額) 
for 季度 in([1],[2],[3],[4],[5]))as pvt


--------列轉行
create table test2(編號 int,姓名 varchar(20), 一季度 int, 二季度 int, 三季度 int, 四季度 int);
insert into test2 values(1,'simon',1000,2000,4000,5000);
insert into test2 values(2,'meme',3000,3500,4200,5500);


select * from test2 
select 編號,姓名,季度,銷售額from test2 unpivot(銷售額for 季度 in(一季度,二季度,三季度,四季度)) as unpvt


建議:如果你想了解的更加清楚,請參考:http://technet.microsoft.com/zh-cn/library/ms177410.aspx
注意:對升級到 SQL Server 2005 或更高版本的資料庫使用 PIVOT 和 UNPIVOT 時,必須將資料庫的相容級別設定為 90 或更高。如果第一種pivot不是很明白可以看看這個select 編號,姓名,[1],[2],[3],[4]
from

select * from test 
) as sourceTable
pivot
(
sum(銷售額)
for 季度 in ([1],[2],[3],[4])
)as pivotTable這個是自己寫的,稍稍明白一點!

相關推薦

使用pivotunpivot語句實現,轉行

在做報表時,經常需要將資料表中的行轉列,或者列轉行,如果不知道方法,你會覺得通過SQL語句來實現非常難。這裡,我將使用pivot和unpivot來實現看似複雜的功能。 引用MSDN: 可以使用 PIVOT 和 UNPIVOT 關係運算符將表值表示式更改為另一個表。PIVOT

SQL語句實現

within sel 11g wm_concat 進行 com 10g 本地測試 from 最近在維護一個項目,出現了一下bug需要進行調試,於是把正式庫上面的代碼搬到本地庫上面,數據庫是本地的,跑項目的時候調試發現代碼裏面帶有wmsys.wm_concat函數的SQL語句

SqlServer PIVOT函式快速實現UNPIVOT實現轉行

我們在寫Sql語句的時候沒經常會遇到將查詢結果行轉列,列轉行的需求,拼接sql字串,然後使用sp_executesql執行sql字串是比較常規的一種做法。但是這樣做實現起來非常複雜,而在SqlServer2005中我們有了PIVOT/UNPIVOT函式可以快速實現行轉列和

Oracle SQL函式pivotunpivot置函式實現轉行

函式PIVOT、UNPIVOT轉置函式實現行轉列、列轉行,效果如下圖所示: 1.PIVOT為行轉列,從圖示的左邊到右邊 2.UNPIVOT為列轉行,從圖示的右邊到左邊 3.左邊為縱表,結構簡單,易擴充套件 4.右邊為橫表,展示清晰,方便查詢 5.很多時候業務表為縱表,但是統

SQL資料庫查詢實現轉行結果SQL語句

 CREATETABLE[StudentScores](    [UserName]NVARCHAR(20),        --學生姓名[Subject]NVARCHAR(30),        --科目[Score]FLOAT,               --成績)INSERTINTO[StudentS

Oracle 11g Pivot函式實現

先上語法規範: SELECT .... FROM PIVOT ( aggregate-function() FOR IN (, ,..., )

Pivot Unpivot 幷包含多個名稱

Pivot 1、準備資料 create table t_demo(id int,name varchar(20),nums int); ---- 建立表 insert into t_demo values(1, '蘋果', 1000); insert into

單純的將資料怎麼實現(急急急)

已解決一個web登入系統的如何訪問資料庫 innobackupex備份mysql速度如何? 求助一個mysql儲存過程的問題51 已解決mysqlcluster關於管理節點的問題 匭鼐uth茸陀儼http://baoba

SQL2005/2008中實現的2種方法

  CREATE TABLE sales.salesByMonth(year char(4),month char(3),amount money,PRIMARY KEY (year, month))INSERT INTO sales.salesByMonth (year,

MySQL中GROUP_CONCAT函式長度限制處理/實現的功能

MySQL提供了一個很方便的函式group_concat可以實現行轉列的功能。 SELECT t.*, (SELECT GROUP_CONCAT(fellow_company_id) v1 FROM t_trade_fellow a WHERE fellow_type = '1' AND a.company_

MySQL 如何實現分級輸出?

概述好久沒寫SQL語句,今天看到問答中的一個問題,拿來研究一下。情景簡介學校裡面記錄成績,每個人的選課不一樣,而且以後會新增課程,所以不需要把所有課程當作列。資料表裡面數據如下圖,使用姓名+課程作為聯合主鍵(有些需求可能不需要聯合主鍵)。本文以MySQL為基礎,其他資料庫會有

mysql sql語句問題

存在表score,記錄學生的考試成績,如下圖所示:                現要求以 學生姓名,語文,數學,英語 這種格式顯示學生成績,如下圖所示                具體步驟如下:1、首先,使用case when函式輸出單個課程的成績case when co

數不確定

原始需求,有2表如下 SQL> select * from mas; TO TOOLNAME -- ---------- 01 包裹 02 信函 03 掛號信 04 中國速遞 05 EMS 06 DHL 6 rows selected. SQL> select * from putdt; SEN

如何優雅地使用R實現

網上有網友問到:在一個資料夾下,收集了幾個股票資料的檔案,對應的股票名稱為第2列,對應的時間為第3列,對應的收盤價為第10列。 現在想做到下圖所示的效果,也就是行為時間,列為對應的股票的收盤

MySQL 實現SQL

概述 好久沒寫SQL語句,今天看到問答中的一個問題,拿來研究一下。 情景簡介 學校裡面記錄成績,每個人的選課不一樣,而且以後會新增課程,所以不需要把所有課程當作列。資料表裡面數據如下圖,使用姓名+課程作為聯合主鍵(有些需求可能不需要聯合主鍵)。本文以MySQL為基

linq實現

nt maxcount = Model .SelectMany(h => h.DetailList).OrderBy(h => h.DetailType) .

LINQ TO SQL 實現

表結構如下: id NAME result ----------- -------------------- ------ 1 jim 勝 2

oracle 行列互 pivot unpivot

行轉列pivot 建立表 with data_tab as( select '1991' year,1 month,11 amount from dual union all select '

oracle pivot unpivot 函數的使用

greate 列轉行 格式 cert list nth 字段類型 query apr pivot的格式select from( inner_query)pivot(aggreate_function for pivot_column in ( list of values

hiveLATERAL VIEW explode

lateral view用於和split、explode等UDTF一起使用的,能將一行資料拆分成多行資料,在此基礎上可以對拆分的資料進行聚合,lateral view首先為原始表的每行呼叫UDTF,UDTF會把一行拆分成一行或者多行,lateral view在把結果組合,產生一個支援別名表的