如何返回0(而不是NULL)的count(*)

ala*_*dey 4 sql t-sql sql-server aggregate-functions

我有这段代码:

SELECT Project, Financial_Year, COUNT(*) AS HighRiskCount
INTO #HighRisk 
FROM #TempRisk1
WHERE Risk_1 = 3
GROUP BY Project, Financial_Year
Run Code Online (Sandbox Code Playgroud)

当计数为零时,它不会返回任何行.如何在HighRiskCount设置为0的情况下显示这些行?

Ada*_*son 9

当行计数为0时,您无法从表中选择值.在哪里可以获得不存在的行的值?

为此,您必须有另一个表来定义有效值ProjectFinancial_Year值列表.然后,您将从此表中进行选择,left join在现有表上执行a ,然后进行分组.

像这样的东西:

SELECT l.Project, l.Financial_Year, COUNT(t.Project) AS HighRiskCount
INTO #HighRisk 
FROM MasterRiskList l
left join #TempRisk1 t on t.Project = l.Project and t.Financial_Year = l.Financial_Year
WHERE t.Risk_1 = 3
GROUP BY l.Project, l.Financial_Year
Run Code Online (Sandbox Code Playgroud)


Ste*_*Mol 9

将您的SELECT查询包装在一个ISNULL

SELECT ISNULL((SELECT Project, Financial_Year, COUNT(*) AS hrc
INTO #HighRisk 
FROM #TempRisk1
WHERE Risk_1 = 3
GROUP BY Project, Financial_Year),0) AS HighRiskCount
Run Code Online (Sandbox Code Playgroud)

如果您SELECT返回一个数字,它将通过。如果它返回NULL0将通过。


t-c*_*.dk 5

假设您有您的“项目”和“财务年”,其中​​ Risk_1 与 3 不同,而这些是您打算包括的。

SELECT Project, Financial_Year, SUM(CASE WHEN RISK_1 = 3 THEN 1 ELSE 0 END) AS HighRiskCount
INTO #HighRisk 
FROM #TempRisk1
GROUP BY Project, Financial_Year
Run Code Online (Sandbox Code Playgroud)

注意我删除了 where 部分。

顺便说一下,您当前的查询没有返回 null,它没有返回任何行。


Jer*_*ins -1

MSDN - ISNULL 函数


SELECT Project, Financial_Year, ISNULL(COUNT(*), 0) AS HighRiskCount
INTO #HighRisk 
FROM #TempRisk1
WHERE Risk_1 = 3
GROUP BY Project, Financial_Year
Run Code Online (Sandbox Code Playgroud)

  • 与其他类似的答案一样,这是行不通的。如果没有行提供“Project”和“Financial_Year”的值,那么从哪里获取它们呢? (2认同)
  • 你是对的,我在发帖后大约三秒钟就意识到了这一点。像这样的时候,我希望有一种方法可以删除,但我想下次我会在提交之前多花 3 秒钟思考一下…赞成票来了… (2认同)