2016-08-09 56 views
0

我只是無法弄清楚如何執行此數據透視查詢。我嘗試了幾個變化,但我不斷收到錯誤!帶摘要數據的SQL數據透視查詢

我有這樣的數據:

ID OfficerAge CitizenAge 
1  35    21 
2  36    33 
3  22    18 

,我可以很容易地得到各年齡組的每個人,但我希望有一個矩陣:

Officer/Citizen: Under 19 20-29 30-39 
Under 19   0   0  0 
20-29    1   0  0 
30-39    0   1  1 

我很欣賞在得到正確構建查詢的任何援助!

謝謝!

回答

2

使用聚合只是構建查詢:

select (case when officerage < 19 then 'Under 19' 
      when officerage < 30 then '19-29' 
      when officerage < 40 then '30-39' 
      else 'old!' 
     end) as officeragegrp, 
     sum(case when citizenage < 19 then 1 else 0 end) as [Under 19], 
     sum(case when citizenage >= 19 and citizenage < 30 then 1 else 0 end) as [19-29], 
     sum(case when citizenage >= 30 and citizenage < 40 then 1 else 0 end) as [30-39], 
     sum(case when citizenage > 39 then 1 else 0 end) as [Old!] 
from t 
group by (case when officerage < 19 then 'Under 19' 
       when officerage < 30 then '19-29' 
       when officerage < 40 then '30-39' 
       else 'old!' 
      end) 
order by min(officerage); 

編輯:

如果需要甚至包括不存在的組,然後left join幫助:

select officeragegroupp, 
     sum(case when citizenage < 19 then 1 else 0 end) as [Under 19], 
     sum(case when citizenage >= 19 and citizenage < 30 then 1 else 0 end) as [19-29], 
     sum(case when citizenage >= 30 and citizenage < 40 then 1 else 0 end) as [30-39], 
     sum(case when citizenage > 39 then 1 else 0 end) as [Old!] 
from (select 'Under 19' as officeragegroup union all 
     select '19-29' union all 
     select '30-39' union all 
     select 'old!' 
    ) oag left join 
    (select t.*, 
      (case when officerage < 19 then 'Under 19' 
        when officerage < 30 then '19-29' 
        when officerage < 40 then '30-39' 
        else 'old!' 
       end) as officeragegroup 
     from t 
    ) t 
    on t.officeragegroup = oag.officeragegroup 
group by oag.officeragegroup 
order by min(t.officerage); 
+0

不錯!但不包括[19歲以下]的年齡段,全0。 (我的意思是它會包括它,如果值> 0,但是) –