一道面試題

有一張表兩個字段:_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)

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值