MSSQL计数多列

时间:2016-06-30 12:37:54

标签: sql sql-server

说我在ms sql 2008中有这样的表:

+------+--------+---------+
| 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   |
+------+--------+---------+

我希望得到每个列的计数,类似这样的

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

首先,可以这样做吗?第二,怎么样?我已经搜索过,但无法找到我正在寻找的内容。

3 个答案:

答案 0 :(得分:1)

我认为最简单的方法是使用UNION ALLCASE EXPRESSION与条件聚合一起使用:

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

答案 1 :(得分:0)

我建议将值放入不同的格式:

  • 选择
  • CNT

您可以这样做:

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;

将其切换为您的格式很容易:

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;

我更喜欢第一种格式。更容易推广到更多列。

答案 2 :(得分: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