SELECT 基于列值计数

SELECT count based on columns value

我有一个table这样的

Date  | Name  | StateData |
------+-------+-----------+    
xxxxx | Tom   | OPENED    |
xxxxx | David | NULL      |
xxxxx | Tom   | NULL      |
xxxxx | Brand | CLOSED    |
xxxxx | Brand | NULL      |
xxxxx | Brand | OPENED    |

我想要达到的结果是这样的

Date | Name | OPENED | CLOSED | UNUSED |
-----+------+--------+--------+--------+
xxxxx| Tom  |   1    |    0   |    1   |
xxxxx| David|   0    |    0   |    1   |
xxxxx| Brand|   1    |    1   |    1   |

我试过这样的东西

SELECT 
    Name,
    [OPENED] = COUNT(CASE WHEN StateData ='OPENED' THEN StateData END),
    [CLOSED] = COUNT(CASE WHEN StateData ='CLOSED' THEN StateData END),
    [UNUSED] = COUNT(CASE WHEN StateData IS NULL THEN StateData END)
FROM 
    [dbo].[StateData]
GROUP BY
    Name

结果是我在 Name 列中至少没有重复记录,但我可以通过简单的 select count(*) 清楚地看到列中的计数不正确。

首先我做了google一些样本,然后做了上面的SELECT。

这是一个 "simple" 支点。但是,就个人而言,我更喜欢使用交叉表,而不是限制性的 PIVOT 运算符:

SELECT [Date],
       [Name],
       COUNT(CASE StateData WHEN 'OPENED' THEN 1 END) AS OPENED,
       COUNT(CASE StateData WHEN 'CLOSED' THEN 1 END) AS CLOSED,
       COUNT(CASE WHEN StateData IS NULL THEN 1 END) AS UNUSED
FROM YourTable
GROUP BY [Date],
         [Name];

请注意,您标记的 SQL 服务器版本 (2008) 现在完全不受支持。因此强烈建议您尽快查看升级路径。

我会改用 SUM()NULL:

有问题
SELECT Name,
       SUM(CASE WHEN StateData = 'OPENED' THEN 1 ELSE 0 END) as opened
       SUM(CASE WHEN StateData = 'CLOSED' THEN 1 ELSE 0 END) as closed
       SUM(CASE WHEN StateData IS NULL THEN 1 ELSE 0 END) as unused
FROM [dbo].[StateData]
GROUP BY Name;

您的 unused 将始终为零,因为 COUNT(NULL) 始终为零。