Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/ssh/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 如何返回0而不是NULL的计数(*)_Sql_Sql Server_Tsql_Aggregate Functions - Fatal编程技术网

Sql 如何返回0而不是NULL的计数(*)

Sql 如何返回0而不是NULL的计数(*),sql,sql-server,tsql,aggregate-functions,Sql,Sql Server,Tsql,Aggregate Functions,我有一段代码: SELECT Project, Financial_Year, COUNT(*) AS HighRiskCount INTO #HighRisk FROM #TempRisk1 WHERE Risk_1 = 3 GROUP BY Project, Financial_Year 当计数为零时,它不会返回任何行。如何使这些行在HighRiskCount设置为0时显示 当行计数为0时,无法从表中选择值。它从哪里获得不存在的行的值 为此,您必须有另一个表来定义有效项目和财务年度值的列

我有一段代码:

SELECT Project, Financial_Year, COUNT(*) AS HighRiskCount
INTO #HighRisk 
FROM #TempRisk1
WHERE Risk_1 = 3
GROUP BY Project, Financial_Year
当计数为零时,它不会返回任何行。如何使这些行在HighRiskCount设置为0时显示


当行计数为0时,无法从表中选择值。它从哪里获得不存在的行的值

为此,您必须有另一个表来定义有效项目和财务年度值的列表。然后从该表中进行选择,对现有表执行左联接,然后进行分组

大概是这样的:

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
使用:


获取零计数的唯一方法是对要查看零计数的不同值的列表使用外部联接。

SQL通常在返回不在表中的值时遇到问题。要在没有存储过程的情况下完成此操作,无论如何,您都需要另一个包含缺少的值的表

假设每个项目/财政年度组合需要一行,则需要一个包含每个有效项目、财政年度组合的表:

 SELECT HR.Project, HR.Financial_Year, COUNT(HR.Risk_1) AS HighRiskCount
 INTO #HighRisk HR RIGHT OUTER JOIN ProjectYears PY
   ON HR.Project = PY.Project AND HR.Financial_Year = PY.Financial_Year
 FROM #TempRisk1
 WHERE Risk_1 = 3
 GROUP BY HR.Project, HR.Financial_Year
请注意,我们正在利用这样一个事实,即COUNT将只对非NULL值进行计数,从而为那些仅由新ProjectYears表中的数据组成的结果集记录获得0计数结果


或者,每个项目可能只返回一条0计数记录,或者每个财政年度返回一条。您可以修改上述解决方案,使联接表只有一列。

假设您的“项目”和“财务年度”的风险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
注意,我删除了where部分


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

稍长一点,但是作为一种解决方案,这又如何呢

IF EXISTS (
        SELECT *
        FROM #TempRisk1
        WHERE Risk_1 = 3
    )
    BEGIN
        SELECT Project, Financial_Year, COUNT(*) AS HighRiskCount
        INTO #HighRisk 
        FROM #TempRisk1
        WHERE Risk_1 = 3
        GROUP BY Project, Financial_Year
    END
ELSE
    BEGIN
        INSERT INTO #HighRisk 
            SELECT 'Project', 'Financial_Year', 0
    END
将SELECT查询包装在ISNULL中:


如果您的选择返回一个数字,它将通过。如果返回NULL,0将通过。

与其他类似答案一样,这将不起作用。如果这些行不提供项目和财务年度的值,它将从何处获得这些值?你是对的,我在发布后大约3秒钟就意识到了这一点。这是这样的时候,我希望有一个方法删除,所以,但我想下次我会采取额外的3秒思考之前提交。。。向上投票…关键点。到目前为止,所有其他答案都忽略了这一点。当计数为零时,哪些值将被放入项目和财务年度中?它从主列表中选择项目和财务年度,因此当计数为零时,它将显示这些值。@JamesJiao:MasterRiskList是我添加到查询中的一个示例;这不是OP的问题我知道。。我指的是什么。你能确认存在风险为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
IF EXISTS (
        SELECT *
        FROM #TempRisk1
        WHERE Risk_1 = 3
    )
    BEGIN
        SELECT Project, Financial_Year, COUNT(*) AS HighRiskCount
        INTO #HighRisk 
        FROM #TempRisk1
        WHERE Risk_1 = 3
        GROUP BY Project, Financial_Year
    END
ELSE
    BEGIN
        INSERT INTO #HighRisk 
            SELECT 'Project', 'Financial_Year', 0
    END
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