有一張表兩個字段:_date,_num,
現在要產生如下的表格,請設計相關SQL語句。
年份
1月
2月
3月
4月
5月
6月
7月
8月
9月
10月
11月
12月
2010
數量
數量
數量
數量
數量
數量
數量
數量
數量
數量
數量
數量
2011
數量
數量
數量
數量
數量
數量
數量
數量
數量
數量
數量
數量
……
sql code
--創建測試表
CREATE TABLE Test
(
_date DATETIME,
_num INT
)
--插入測試數據
INSERT dbo.Test
SELECT '2010-01-01',100 UNION ALL
SELECT '2010-02-01',100 UNION ALL
SELECT '2010-03-01',100 UNION ALL
SELECT '2010-04-01',200 UNION ALL
SELECT '2010-05-01',300 UNION ALL
SELECT '2010-06-01',400
SELECT * FROM dbo.Test
--創建臨時表
CREATE TABLE #table
(
_year INT,
_month INT,
_num INT
)
--為臨時表插入數據
INSERT #table
SELECT
YEAR(t.[_date]),
MONTH(t.[_date]),
SUM(t._num)
FROM dbo.Test t
GROUP BY YEAR(t.[_date]),MONTH(t.[_date])
--查詢結果如下
SELECT t.[_year] '年份',
SUM(CASE t.[_month] WHEN 1 THEN t.[_num] ELSE 0 END) AS '1月',
SUM(CASE t.[_month] WHEN 2 THEN t.[_num] ELSE 0 END) AS '2月',
SUM(CASE t.[_month] WHEN 3 THEN t.[_num] ELSE 0 END) AS '3月',
SUM(CASE t.[_month] WHEN 4 THEN t.[_num] ELSE 0 END) AS '4月',
SUM(CASE t.[_month] WHEN 5 THEN t.[_num] ELSE 0 END) AS '5月',
SUM(CASE t.[_month] WHEN 6 THEN t.[_num] ELSE 0 END) AS '6月',
SUM(CASE t.[_month] WHEN 7 THEN t.[_num] ELSE 0 END) AS '7月',
SUM(CASE t.[_month] WHEN 8 THEN t.[_num] ELSE 0 END) AS '8月',
SUM(CASE t.[_month] WHEN 9 THEN t.[_num] ELSE 0 END) AS '9月',
SUM(CASE t.[_month] WHEN 10 THEN t.[_num] ELSE 0 END) AS '10月',
SUM(CASE t.[_month] WHEN 11 THEN t.[_num] ELSE 0 END) AS '11月',
SUM(CASE t.[_month] WHEN 12 THEN t.[_num] ELSE 0 END) AS '12月'
FROM #table t GROUP BY t.[_year]
--刪除臨時表
DROP TABLE #table
經過研究,其實可以更簡單,採用數據透視方法。
code如下:
declare @sql varchar(max)
set @sql = 'select year(_date) [年份]'
select @sql = @sql + ',sum(case month(_date) when ''' + ltrim(_date) + ''' then _num else 0 end) [' + ltrim(_date) + '月]'
from (select month(_date) _date from dbo.Test group by month(_date)) t
select @sql = @sql + ' from Test group by year(_date)'
exec(@sql)