1.原始查詢
select s.name as結果如下shiftname,
h.businessentityid,
d.name
asdepartmentname
from
humanresources.employeedepartmenthistory h
inner
join
humanresources.department d
on h.departmentid =
d.departmentid
inner
join
humanresources.shift s
on h.shiftid =
s.shiftid
where enddate is
null
and d.name in ('
production
', '
engineering
', '
marketing')
order
by shiftname;
在這個結果集中,我們可以看到所有的部門都列在乙個列中。下一步是將此查詢返回的部門值轉換為列,以及按班次計算的員工數。
想要實現的效果
2.用pivot關鍵字進行行列轉換
1結果如下:select
shiftname,
2production,
3engineering,
4marketing
5from (select s.name as
shiftname,
6h.businessentityid,
7 d.name as
departmentname
8from
humanresources.employeedepartmenthistory h
9inner
join
humanresources.department d
10on h.departmentid =
d.departmentid
11inner
join
humanresources.shift s
12on h.shiftid =
s.shiftid
13where enddate is
null
14and d.name in ('
production
', '
engineering
', '
marketing
')
15 ) asa16
pivot
17(
18count
(businessentityid)
19for departmentname in ([
production
], [
engineering
], [
marketing])
20 ) asb21
order
by shiftname;
3.轉換的語法如下:
4.引數的定義如下:
官網示義
5.在引入pivot操作符之前,我們是通過以下語句進行轉換的
1也是同樣結果select s.name as
shiftname,
2sum(case
when d.name =
'production
'then
1else
0end) as
production,
3sum(case
when d.name =
'engineering
'then
1else
0end) as
engineering,
4sum(case
when d.name =
'marketing
'then
1else
0end) as
marketing
5from
humanresources.employeedepartmenthistory h
6inner
join
humanresources.department d
7on h.departmentid =
d.departmentid
8inner
join
humanresources.shift s
9on h.shiftid =
s.shiftid
10where h.enddate is
null
11and d.name in ('
production
', '
engineering
', '
marketing')
12group
by s.name;
6.這兩種方法無論是用pivot關鍵字還是直接聚合運算都需要事先知道部門的名稱,因為必須要有列名,
這種情況可以先查詢一下部門,然後動態拼接進column_list ,但是這種動態拼接似乎用第二種方式無法實現
SQL Server行列轉換
行列轉換應該非常廣泛,也就是常說的交叉表,範例如下 注意事項 資料庫相容性級別 sql server 2005 90 建立臨時測試表 create table test 姓名 varchar 10 課程 varchar 10 分數 int insert into test values 張三 語文 ...
SQL Server 行列轉換
報表顯示需求,查詢結果往往需要做一些行列轉換或列行轉換來顯示。就以這個例子的資料來源做演示。正常查詢結果顯示和執行結果,如下 下面演示,把 rid 和 dt 作為列顯示 view code select rid sum case when dt 2011 01 23 then hits end as...
SQL Server 行列轉換 2
參考前乙個例子現想使用另外一種方式來處理行列轉換,實現下面效果 產生唯一字段,稍後為迴圈使用 rid nvarchar 2 dt date,hits int 把需要處理的資料記錄預存入這個臨時表中 insert into dbo t select rid dt hits from dbo recor...