【问题标题】:How to include 0 in the result of count query如何在计数查询的结果中包含 0
【发布时间】:2016-01-28 23:07:24
【问题描述】:

我有 4 个表,存储 4 种请求:休假 (TO)、会议 (MT)、PO 和旅行 (TR)。

我想统计过去 30 天内每个表中每种类型的请求总数:

  SELECT [requestType], COUNT ([requestType]) As 'Count' 
  FROM [Timeoff] 
  WHERE [requestType] = 'TO' AND CAST([timeoffCreatedTime] AS DATE) >= CAST(DateAdd(DAY,-30,Getdate()) AS DATE) GROUP BY [requestType]
  UNION ALL
  SELECT [requestType], COUNT ([requestType]) As 'Count' 
  FROM [Meeting] 
  WHERE [requestType] = 'MT' AND CAST([meetingCreatedTime] AS DATE) >= CAST(DateAdd(DAY,-30,Getdate()) AS DATE) GROUP BY [requestType]
  UNION ALL
  SELECT [requestType], COUNT ([requestType]) As 'Count' 
  FROM [PO] 
  WHERE [requestType] = 'PO' AND CAST([poCreatedTime] AS DATE) >= CAST(DateAdd(DAY,-30,Getdate()) AS DATE) GROUP BY [requestType]
  UNION ALL
  SELECT [requestType], COUNT ([requestType]) As 'Count' 
  FROM [Travel] 
  WHERE [requestType] = 'TR' AND CAST([travelCreatedTime] AS DATE) >= CAST(DateAdd(DAY,-30,Getdate()) AS DATE) GROUP BY [requestType]

问题是,如果计数为 0,那么它根本不会出现在结果中,例如,如果会议请求的计数 = 0,那么我只有这个结果:

我如何在结果中包含 0 值,所以我会有类似的东西(如果 Meeting MT count = 0):

requestType --- 计数

到 ------------- 30

MT ------------- 0

PO -------------19

TR -------------9

【问题讨论】:

  • 为什么要编写 Group By 子句?我认为不需要作为我的书面解决方案

标签: sql sql-server join count aggregate-functions


【解决方案1】:

您必须从查询中删除 GROUP BY,这不是必需的! 您的查询应该是:

SELECT 'TO' AS [requestType], COUNT ([requestType]) As 'Count' 
  FROM [Timeoff] 
  WHERE [requestType] = 'TO' AND CAST([timeoffCreaime] ATE) >= CASt(DAY,-30,Gte()) ATE)
  UNION ALL
  SELECT 'Meeting' AS [requestType], COUNT ([requestType]) As 'Count' 
  FROM [Meeting] 
  WHERE [requestType] = 'Meeting' AND CAST([meetingCreaime] ATE) >= CASt(DAY,-30,Gte()) ATE)
  UNION ALL
  SELECT 'PO' AS [requestType], COUNT ([requestType]) As 'Count' 
  FROM [PO] 
  WHERE [requestType] = 'PO' AND CAST([poCreaime] ATE) >= CASt(DAY,-30,Gte()) ATE)
  UNION ALL
  SELECT 'TR' AS [requestType], COUNT ([requestType]) As 'Count' 
  FROM [Travel] 
  WHERE [requestType] = 'TR' AND CAST([travelCreaime] ATE) >= CASt(DAY,-30,Gte()) ATE)

【讨论】:

  • 它已经以这种方式硬编码,他需要在 WHERE 过滤器中使用它,因为我不知道他的业务逻辑。
  • 我回滚了编辑以将其恢复到原始状态。要使您的代码正常工作,您需要从 select 语句中删除 RequestType 并对 RequestType 进行硬编码。
  • @AnupAgrawal 为什么要编辑我的解决方案,其中包含 requestType ... 然后要求这样做? :) Ronaldinho 代码工作正常,只需要删除 GROUP BY 子句即可获得结果中的 0 计数。我认为这应该是一个正确的答案。谢谢
  • 这里可以看到修改历史。 stackoverflow.com/posts/35074523/revisions 。您的代码没有硬编码,根据您的要求,我回滚了包含硬编码的编辑。
  • @AnupAgrawal 我现在明白你的意思了,我把硬编码回来了 :) 谢谢
【解决方案2】:

您可以对每个查询进行外部联接,例如 (select 1)

SELECT [requestType], COUNT ([requestType]) As 'Count' 
  FROM (select 1 as foo) bar
  LEFT JOIN [CTEite].[dbo].[Timeoff] ON 1=1
  WHERE [requestType] = 'TO' AND CAST([timeoffCreaime] ATE) >= CASt(DAY,-

或 UNION 和 sum

WITH foo AS(
SELECT 'TO' as [requestType], 0 as [Count]
UNION ALL
SELECT 'MT', 0
UNION ALL
....
)
SELECT [requestType], sum([Count])
FROM
(SELECT [requestType], COUNT ([requestType]) As 'Count' 
  FROM [CTEite].[dbo].[Timeoff] 
  WHERE [requestType] = 'TO' AND CAST([timeoffCreaime] ATE) >= CASt(DAY,-30,Gte()) ATE) GROUP BY [requestType]
  UNION ALL
  SELECT [requestType], COUNT ([requestType]) As 'Count' 
  FROM [CTEite].[dbo].[Meeting] 
  WHERE [requestType] = 'Meeting' AND CAST([meetingCreaime] ATE) >= CASt(DAY,-30,Gte()) ATE) GROUP BY [requestType]
  UNION ALL
  SELECT [requestType], COUNT ([requestType]) As 'Count' 
  FROM [CTEite].[dbo].[PO] 
  WHERE [requestType] = 'PO' AND CAST([poCreaime] ATE) >= CASt(DAY,-30,Gte()) ATE) GROUP BY [requestType]
  UNION ALL
  SELECT [requestType], COUNT ([requestType]) As 'Count' 
  FROM [CTEite].[dbo].[Travel] 
  WHERE [requestType] = 'TR' AND CAST([travelCreaime] ATE) >= CASt(DAY,-30,Gte()) ATE) GROUP BY [requestType]
 UNION SELECT * FROM foo)
GROUP BY [requestType]

【讨论】:

    猜你喜欢
    • 2017-12-11
    • 2020-10-24
    • 1970-01-01
    • 2020-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-04-27
    相关资源
    最近更新 更多