【问题标题】:Count of records by category, including zeros按类别的记录计数,包括零
【发布时间】:2020-11-10 09:33:06
【问题描述】:

我有一个格式如下的表格:

----------------------------------------------------
| Id | user_name | submitted  |  reviewed  |  returned  |
---------------------------------------------------------
| 1  | tom       | 01-01-2020 | 02-01-2020 |            |
| 2  | mary      | 01-15-2020 |            |            |
| 3  | joe       | 01-25-2020 | 02-07-2020 | 03-04-2020 |
| 4  | tom       | 01-07-2020 |            |            |
| 5  | tom       | 01-04-2020 |            |            |
| 6  | mary      | 01-16-2020 |            |            |
| 7  | joe       | 02-08-2020 | 02-08-2020 | 03-07-2020 |
| 8  | mary      | 01-05-2020 | 01-20-2020 | 03-19-2020 |
| 9  | joe       | 01-21-2020 | 02-09-2020 |            |
---------------------------------------------------------

我想编写一个查询,计算每个用户的已提交、已审核和已返回记录,其中“已提交”是提交日期不为空且已审核和返回为空的任何记录。 “已审核”是提交和审核日期不为空且返回日期为空的任何记录。 "Returned 是提交、审核和返回日期不为空的任何记录。

所需的输出如下:

-----------------------------------------------------
| user_name | # Submitted | # Reviewed | # Returned |
-----------------------------------------------------
| joe       |      0      |      1     |      2     |
| mary      |      2      |      0     |      1     |
| tom       |      2      |      1     |      0     |
-----------------------------------------------------

我尝试执行按用户名分组的三个单独的计数查询,但这些查询缺少零。我对 sql 很陌生,所以任何帮助都将不胜感激。

【问题讨论】:

  • 这里没有问题,您没有提出任何查询遇到的任何问题。
  • 嗨,巴勃罗。抱歉,格式正确时出现问题。希望现在澄清。感谢收看。
  • 我们需要看看你的尝试。

标签: sql sql-server tsql count


【解决方案1】:

只需使用count()。根据您的示例数据,您可以单独查看每一列:

select user_name,
       count(submitted) as num_submitted,
       count(reviewed) as num_reviewed,
       count(returned) as num_returned
from t
group by user_name;

没有示例,例如,returned 不是NULL,而其他任何一列都是NULL

如果确实有可能,您可以使用条件聚合:

select user_name,
       count(submitted) as num_submitted,
       sum(case when submitted is not null and reviewed is not null then 1 else 0 end) as num_reviewed,
       sum(case when submitted is not null and reviewed is not null and returned is not null then 1 else 0 end) as num_returned
from t
group by user_name;

您也可以使用count() 来玩算术游戏:

select user_name,
       count(submitted) as num_submitted,
       count(day(submitted) + day(reviewed)) as num_reviewed,
       count(day(submitted) + day(reviewed) + day(returned)) as num_returned
from t
group by user_name;

这是有效的,因为如果值为 NULLday() 将返回 NULL。如果任何值为NULL,则+ 返回NULL

【讨论】:

  • 谢谢戈登!这成功了。非常感谢您的帮助。
【解决方案2】:

试试这个:

DECLARE @DataSource TABLE
(
    [id] INT
   ,[user_name] NVARCHAR(128)
   ,[submitted] DATE 
   ,[reviewed] DATE 
   ,[returned] DATE
);

INSERT INTO @DataSource ([id], [user_name], [submitted], [reviewed], [returned])
VALUES (1, 'tom', '01-01-2020', '02-01-2020', NULL)
      ,(2, 'mary', '01-15-2020', NULL, NULL)
      ,(3, 'joe', '01-25-2020', '02-07-2020', '03-04-2020')
      ,(4, 'tom', '01-07-2020', NULL, NULL)
      ,(5, 'tom', '01-04-2020', NULL, NULL)
      ,(6, 'mary', '01-16-2020', NULL, NULL)
      ,(7, 'joe', '02-08-2020', '02-08-2020', '03-07-2020')
      ,(8, 'mary', '01-05-2020', '01-20-2020', '03-19-2020')
      ,(9, 'joe', '01-21-2020', '02-09-2020', NULL);

SELECT [user_name]
      ,SUM(IIF([returned] IS NULL AND [reviewed] IS NULL AND [submitted] IS NOT NULL, 1, 0)) AS [ # Submitted]
      ,SUM(IIF([returned] IS NULL AND [reviewed] IS NOT NULL AND [submitted] IS NOT NULL, 1, 0)) AS [# Reviewed]
      ,SUM(IIF([returned] IS NOT NULL AND [reviewed] IS NOT NULL AND [submitted] IS NOT NULL, 1, 0)) AS [# Returned]
FROM @DataSource
GROUP BY [user_name];

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2010-12-09
    • 1970-01-01
    • 1970-01-01
    • 2018-04-06
    相关资源
    最近更新 更多