2016-06-30 16 views
1

Sagen wir, ich habe eine Tabelle wie diese in MS SQL 2008:MSSQL Count mehrere Spalten

+------+--------+---------+ 
| year | JAN | FEB | 
+------+--------+---------+ 
| 2016 | 5K2 | 5K2 | 
| 2016 | 5K2 | 5K2 | 
| 2016 | 5K2 | 5K2 | 
| 2016 | 8Z | 8Z | 
| 2016 | R5205 | R5205 | 
| 2016 | 5K2 | 5K2 | 
| 2016 | 5K2 | 5K2 | 
| 2016 | NULL | NULL | 
| 2016 | TE | NULL | 
| 2016 | TE | NULL | 
| 2016 | 8Z | 8Z | 
+------+--------+---------+ 

Und ich will für jede Spalte eine Zählung bekommen, so etwas wie dieses

+------+--------+---------+ 
| opt | JAN_cnt| FEB_cnt | 
+------+--------+---------+ 
| 5K2 | 5 | 4  | 
| 8Z | 2 | 2  | 
| R5205| 1 | 1  | 
| TE | 2 | 0  | 
| NULL | 1 | 4  | 
+------+--------+---------+ 

Erstens kann das getan werden? Zweitens, wie? Ich habe gesucht, kann aber nicht genau finden, wonach ich suche.

+3

Zwei Fragen: Die erste, eine Tabelle mit allen Optionen? Die zweite: Warum NULL 1,4 statt 1,3 –

Antwort

1

Ich denke, die einfachste Art und Weise UNION ALL mit bedingter Aggregation mit CASE EXPRESSION zu verwenden ist:

SELECT s.opt, 
     COUNT(CASE WHEN s.ind_from = 1 THEN 1 END) as jan_cnt, 
     COUNT(CASE WHEN s.ind_from = 2 THEN 1 END) as feb_cnt 
FROM (
    SELECT t1.jan as opt,1 as ind_from FROM YourTable t1 
    UNION ALL 
    SELECT t2.feb,2 FROM YourTable t2) s 
GROUP BY s.opt 
+0

Ops, Tippfehler :) @RichBenner – sagi

+0

nette Arbeit, upvoted –

+0

Sieht gut aus. Schnelle Frage, was, wenn Feb einen Wert hat, den Jan nicht tut, wird es in dem opt – dk96m

0

rate ich würde die Werte in ein anderes Format setzen:

  • opt
  • Monate
  • cnt

Sie können dies als tun:

select opt, mon, count(*) as cnt 
from ((select jan as opt, 'jan' as mon from t) union all 
     (select feb as opt, 'feb' as mon from t) 
    ) o 
group by opt, mon; 

Es ist einfach genug, um dies zu dir zu wechseln r-Format:

select opt, sum(jan) as jan, sum(feb) as feb 
from ((select jan as opt, 1 as jan, 0 as feb from t) union all 
     (select feb as opt, 0, 1, from t) 
    ) o 
group by opt; 

Ich bevorzuge nur das erste Format. Es ist einfacher, auf mehr Spalten zu verallgemeinern.

0
SELECT COALESCE(t1.JAN, t2.FEB), t1.JAN_cnt, t2.FEB_cnt 
FROM 
(
    SELECT JAN, COUNT(*) AS JAN_cnt 
    FROM yourTable 
    GROUP BY JAN 
) t1 
FULL OUTER JOIN 
(
    SELECT FEB, COUNT(*) AS FEB_cnt 
    FROM yourTable 
    GROUP BY FEB 
) t2 
    ON t1.JAN = t2.FEB