sqlserver 行列轉換 行傳換為列

2022-09-05 03:15:15 字數 3656 閱讀 3442

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...