程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 數據庫知識 >> SqlServer數據庫 >> 關於SqlServer >> SQL Server 2005實現交叉表

SQL Server 2005實現交叉表

編輯:關於SqlServer
日期            時間   售貨金額
2006-01-02       早上    50
2006-01-02       中午    20
2006-01-02       晚上    30
2006-01-02       零晨    40
2006-01-03       早上    40
2006-01-03       中午    60
2006-01-03       晚上    50
2006-01-03       零晨    50
2006-01-04       早上    80
2006-01-04       中午    60
2006-01-04       晚上    20
2006-01-04       零晨    40
...........................
............................
...........................
.........
能否用行轉列的方式在進行數據查詢中將上面數據的查詢結果顯示為:

日期        早上   中午  晚上   零晨   金額小計
2006-01-02   50     20    30      40     140
2006-01-03   40     60    50      50     200
2006-01-04   80     60    30      20     190
..........
..........

--SQL 20005中的處理方式:

--測試環境
Create table T(日期 datetime,時間 varchar(20),售貨金額 int)
insert into T select '2006-01-02','早上',50
union all select '2006-01-02','中午',20
union all select '2006-01-02','晚上',30
union all select '2006-01-02','零晨',40
union all select '2006-01-03','早上',40
union all select '2006-01-03','中午',60
union all select '2006-01-03','晚上',50
union all select '2006-01-03','零晨',50
union all select '2006-01-04','早上',80
union all select '2006-01-04','中午',60
union all select '2006-01-04','晚上',20
union all select '2006-01-04','零晨',40
--查詢
select * ,金額小計=(select sum(售貨金額) from T where 日期=PT.日期 ) from T as TAB
PIVOT
( max(售貨金額)
  for 時間 in ([早上],[中午],[晚上],[零晨])
) as PT
--結果
/*
日期                      早上          中午          晚上          零晨          金額小計
----------------------- ----------- ----------- ----------- ----------- -----------
2006-01-02 00:00:00.000 50          20          30          40          140
2006-01-03 00:00:00.000 40          60          50          50          200
2006-01-04 00:00:00.000 80          60          20          40          200

(3 行受影響)
*/
--刪除測試環境
Drop Table T

 ---動態SQL

DECLARE @S VARCHAR(MAX)
SET @S=''
SELECT @S=@S+',['+時間+']' FROM T
  GROUP BY 時間
SET @S=STUFF(@S,1,1,'')
EXEC('
select 日期,'+@S+',金額小計=(select sum(售貨金額) from T where 日期=PT.日期 ) from T as TAB
PIVOT
( max(售貨金額)
  for 時間 in ('+@S+')
) as PT
')

  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved