2009-04-07 96 views
0

的行我有一個SQL查詢,將代表一個真正的SQL查詢的模擬。SQL查詢 - 沿着數據透視表

Create table #tmp 
(
    Atype varchar(10), 
    Btype varchar(10) 
) 

insert into #tmp values ('a','x') 
insert into #tmp values ('b','x') 
insert into #tmp values ('a','y') 
insert into #tmp values ('a','y') 
insert into #tmp values ('b','z') 
insert into #tmp values ('b','y') 

select atype, btype,count(*) as count 
from #tmp 
group by atype, btype 
order by atype 

drop table #tmp 

這會給我的結果:

atype btype count 
----------------- 
a  x  1 
a  y  2 
b  x  1 
b  y  1 
b  z  1 

我所期待的在這之後是能夠創造一個報告,基本上是這樣的:

atype|x| y| z 
------------- 
a |1| 2| 0 
b |1| 1| 1 

我我確信你可以使用來自瘋狂的t-sql代碼來做到這一點,但我很努力地做到這一點。

編輯:

我同意,你可以使用TSQL轉動命令,但是當B型是可變的,會發生什麼。這意味着我不知道會有多少種類型?

回答

3
SELECT 
    atype, 
    SUM(CASE btype WHEN 'x' THEN 1 ELSE 0 END) AS x, 
    SUM(CASE btype WHEN 'y' THEN 1 ELSE 0 END) AS y, 
    SUM(CASE btype WHEN 'z' THEN 1 ELSE 0 END) AS z 
FROM 
    #tmp 
group by 
    atype 
order by 
    atype 
+1

+1爲漂亮和緊湊的代碼。注意自我:使用比較運算符時,把當殼體後立即,如:可樂\t \t \t \t \t,SUM(CASE WHEN天<= 0 THEN 1 ELSE 0 END)AS [0] ,SUM(CASE當天= 1則1否則0結束)AS [1] – mg1075 2011-09-25 03:55:20

+0

@ mg1075寫'WHEN'的兩種形式是互不相同的:'CASE x當1然後當2當杆終止'類似於一個`開關`聲明,它不接受表達式。然而`案例當x = 1那麼foo當x = 2那麼吧END`類似於`if-else if'並且期望表達式。爲每種情況使用適當的表格。 – Tomalak 2011-09-25 07:16:16

1

@Tomalak的回答很好,但沒有什麼好玩的,只是普通的舊SQL

這裏是真的瘋了T-SQL代碼,你問,如果你有興趣:

SELECT atype, [x], [y], [z] 
FROM (
     SELECT atype, btype 
     FROM #tmp 
     ) t 
PIVOT 
     (
     COUNT(btype) 
     FOR btype IN ([x], [y], [z]) 
     ) AS PivotTable