碰上了行轉列的問題,想起了 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...