有一張表兩個字段:
_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
allselect
'2010-02-01'
,100 union
allselect
'2010-03-01'
,100 union
allselect
'2010-04-01'
,200 union
allselect
'2010-05-01'
,300 union
allselect
'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
tgroup
byyear(t.
[_date]
),month(t.
[_date])
--查詢結果如下
selectt.
[_year]'年份
',sum
(caset.
[_month]
when 1 thent.
[_num]
else 0 end)as
'1月',
sum(caset.
[_month]
when 2 thent.
[_num]
else 0 end)as
'2月',
sum(caset.
[_month]
when 3 thent.
[_num]
else 0 end)as
'3月',
sum(caset.
[_month]
when 4 thent.
[_num]
else 0 end)as
'4月',
sum(caset.
[_month]
when 5 thent.
[_num]
else 0 end)as
'5月',
sum(caset.
[_month]
when 6 thent.
[_num]
else 0 end)as
'6月',
sum(caset.
[_month]
when 7 thent.
[_num]
else 0 end)as
'7月',
sum(caset.
[_month]
when 8 thent.
[_num]
else 0 end)as
'8月',
sum(caset.
[_month]
when 9 thent.
[_num]
else 0 end)as
'9月',
sum(caset.
[_month]
when 10 thent.
[_num]
else 0 end)as
'10月',
sum(caset.
[_month]
when 11 thent.
[_num]
else 0 end)as
'11月',
sum(caset.
[_month]
when 12 thent.
[_num]
else 0 end)as
'12月'
from
#table
tgroupbyt
.[_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
bymonth
(_date))t
select
@sql
=@sql
+' from test group by year(_date)'
exec
(@sql)
一道面試題
一道面試題 射擊運動員10發打中90環有多少種可能,請編寫程式計算出來,並列印出結果,0環和10環均有效。打中90環就是沒打中10環,所以打中90環跟打中10環的可能性是一樣的。然後開始遞迴狂打槍,一到10就記錄 if params i 10 在迴圈的控制中已經排除了大於10的可能性 i 10 pa...
一道面試題
前些時候在找工作,就在準備結束此次找工作歷程的時候,去了一家公司面試,去了之後技術經理直接帶到一台電腦旁,給了一張紙條,上面是這樣的題目 用c或c 來實現 1 建立一棵樹,該樹的深度是隨機的,每個節點的位元組點數是隨機的。2 給每個節點分配一段隨機大小的記憶體空間,給每個節點賦乙個隨機數。3 遍歷這...
一道面試題
如果n為偶數,則將它除以2,如果n為奇數,則將它加1或者減1。問對於乙個給定的n,怎樣才能用最少的步驟將它變到1。例如 n 61 n 60 n 2 30 n 2 15 n 16 n 2 8 n 2 4 n 2 2 n 2 1 public class myclass public static vo...