2016-08-09 1 views
0

Ich kann einfach nicht meinen Kopf um diese Pivot-Abfrage zu bekommen. Ich habe verschiedene Varianten ausprobiert, aber ich bekomme immer Fehler!SQL Pivot Abfrage mit zusammenfassenden Daten

Ich habe diese Daten:

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

und ich kann leicht die Altersgruppen für jede Person bekommen, aber ich möchte eine Matrix:

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

schätze ich jede Unterstützung bei der richtig gebaut Abfrage bekommen !!

Vielen Dank!

Antwort

2

bauen Sie einfach die Abfrage Aggregation mit:

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); 

EDIT:

Wenn Sie auch Gruppen enthalten müssen, die nicht vorhanden sind, dann wird ein left join hilft:

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

Nice! Aber nicht die Altersgruppe von [Under 19] mit allen Nullen. (Ich meine, es würde es einschließen, wenn es Werte> 0 gab, aber ja) –