【问题标题】:SQL Query with return a value when no records found找不到记录时返回值的 SQL 查询
【发布时间】:2022-11-19 01:21:56
【问题描述】:

我在查询时遇到问题。如果有人可以帮助我如何在找不到记录时返回 0 值。
这是我的 SQL 语句。我尝试将 coalesce 和 max 与此语句一起使用,收到错误

无法对包含聚合或子查询的表达式执行聚合函数。

SELECT COUNT(Status) as Count,
       Status,
       [Area Name]
FROM  dbo.aspx_Inspection 
where [Area Name] like '%Frozen%'
  and (Status='Failed')
  AND DATEDIFF(day,[Assigned Date],GETDATE()) between 0 and 360
GROUP BY Status,
         [Area Name]
ORDER BY Status desc

结果

|(No column name)|  Status  |Area Name|
|----------------|----------|-----------|
|26               | Failed   |Frozen Pond Arena|

【问题讨论】:

  • 因此,您将需要 Status 和 [Area Name] 的值以及零。那些应该为空吗?
  • edit您的问题以包含一些示例数据和所需的结果(作为文本)。
  • @Ben 是的,我需要将其显示为饼图。 - 状态是 Y 轴的标签,计数值是 X 轴的。所以我在查询语句中需要它们

标签: sql sql-server tsql


【解决方案1】:

假设您在 Master.Status 之类的表中有一个状态主列表,您可以这样做

SELECT ISNULL(T.Count,0), M.Status, T.AreaName
FROM
Master.Status M 
LEFT JOIN
(
SELECT COUNT(Status) as Count,
       Status,
       [Area Name]
FROM  dbo.aspx_Inspection 
where [Area Name] like '%Frozen%'
  and (Status='Failed')
  AND DATEDIFF(day,[Assigned Date],GETDATE()) between 0 and 360
GROUP BY Status,
         [Area Name]
)T
ON T.Status=M.Status
ORDER BY M.Status desc

如果 Master.Status 不存在,并且您确定所有状态代码都在 dbo.aspx_Inspection 中,您也可以这样做

SELECT ISNULL(T.Count,0), M.Status, T.AreaName
FROM
(SELECT DISTINCT Status FROM  dbo.aspx_Inspection ) M 
LEFT JOIN
(
SELECT COUNT(Status) as Count,
       Status,
       [Area Name]
FROM  dbo.aspx_Inspection 
where [Area Name] like '%Frozen%'
  and (Status='Failed')
  AND DATEDIFF(day,[Assigned Date],GETDATE()) between 0 and 360
GROUP BY Status,
         [Area Name]
)T
ON T.Status=M.Status
ORDER BY M.Status desc

【讨论】:

  • 也许是这样的,但是 UNION,而不是 JOIN,两个结果集在一起所以所有的东西都只返回三列?
  • @DhruvJoshi 谢谢。会尝试
猜你喜欢
  • 2013-10-31
  • 2019-08-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-04-24
  • 2011-07-18
  • 1970-01-01
  • 2013-03-01
相关资源
最近更新 更多