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)
始终为零。
我有一个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)
始终为零。