行轉列 pivot 的應用

2021-05-23 19:19:26 字數 2478 閱讀 9658

碰上了行轉列的問題,想起了 pivot,我們先看看 pivot 是什麼:

pivot

通過將表示式某一列中的唯一值轉換為輸出中的多個列來旋轉錶值表示式,並在必要時對最終輸出中所需的任何其餘列值執行聚合

旋轉?不就是行轉列嗎?

再看看語法

以下是帶批註的 pivot 語法。

select 《非透視的列》,

[第乙個透視的列] as 《列名稱》,

[第二個透視的列] as 《列名稱》,

...

[最後乙個透視的列] as 《列名稱》,

from

(《生成資料的 select 查詢》)

as 《源查詢的別名》

pivot

(

《聚合函式》(《要聚合的列》)

for

[《包含要成為列標題的值的列》]

in ( [第乙個透視的列], [第二個透視的列],

... [最後乙個透視的列])

) as 《透視表的別名》

《可選的 order by 子句》;

下面是例子:

kqrecord表

idempid

flag

state

datetime

auditingflag

timeid

remark

311812

12010-9-1 12:00:00

false

1null

311911

12010-9-1 13:00:00

false

2null

312012

12010-9-1 17:30:00

false

2null

312111

22010-9-1 18:00:00

false

3null

312212

12010-9-1 21:30:00

false

3null

311711

22010-9-1 9:00:00

false

1null

kqtime表

idtimename1上午

2下午3晚班

我要的結果:

儲存過程:

create procedure [dbo].[get_kqrecord]

@empid int,

@classdate datetime

asbegin

select t1.timeid,timename,sbs,sbt,xbs,xbt from

(select timeid,[1] as sbs,[2] as xbs from 

(select  timeid,flag,[state] from kqrecord where empid=@empid and [datetime] between @classdate and dateadd(day,1,@classdate) )

as a pivot (max([state]) for flag in ([1],[2])) as b) as t1

inner  join

(select timeid,[1] as sbt,[2] as xbt from

(select timeid,flag,[datetime] from kqrecord where empid=@empid and [datetime] between @classdate and dateadd(day,1,@classdate))

as c pivot (min([datetime]) for flag in ([1],[2])) as d) as t2

on t1.timeid=t2.timeid

inner join

kqtime as t3

on t1.timeid=t3.id

end

執行結果如上圖所示,兩個旋轉後的結果集拼接而成,暫時就這樣了~~

總結:pivot就是旋轉結果集的,

《包含要成為列標題的值的列》就是你想轉的列,它的值就是《要聚合的列》

PIVOT函式,行轉列

pivot函式的格式如下 pivot 聚合函式 聚合列值 for 行轉列前的列名 in 行轉列後的列名1 行轉列後的列名2 行轉列後的列名3 行轉列後的列名n select from shoppingcart as c pivot count totalprice for week in 1 2 3...

sql 行轉列使用pivot

select from select 商品名稱,銷售數量,月份 from tb helenzhou as t1 被行轉列的字段先在這裡列出來 pivot sum 銷售數量 for 月份 in 1 2 as t2 goup by 除了銷售數量和月份之外的的被上面列出來的其他字段 privot sum ...

sql的行轉列 PIVOT 有感

今天在論壇遇到兩個問題。如下 問題一 問題二都是行轉烈的動態實現。動態生成如下sql語句 select from select 分類 轉換列 求和列 as a pivot sum 求和列 for a.轉換列 in 值1 值2 as b比如問題二 測試資料 if object id tempdb.te...