如何按照以下标准编写SQL?

3
SELECT TestName,
    SUM(TestFee) AS TestFee ,
    COUNT(*) "No of Tests"
    FROM  ALLPATIENTINFO 
    WHERE ReqDate BETWEEN '2016-11-04' AND '2016-11-05'
    GROUP BY  TestName

这里只显示了测试名称、总数和计数,根据日期筛选。但是我想显示所有保存在数据表中的测试名称。如果测试名称超出此日期,则仅显示测试名称,测试费用和计数将为零。


1
请更新您的问题并展示一个合适的数据样本和期望的结果。 - ScaisEdge
2个回答

1
这里的一个选择是将 WHERE 子句的逻辑移到 SELECT 子句中,并使用条件聚合:
SELECT TestName,
       SUM(CASE WHEN ReqDate BETWEEN '2016-11-04' AND '2016-11-05'
                THEN TestFee ELSE 0 END) AS TestFee,
       SUM(CASE WHEN ReqDate BETWEEN '2016-11-04' AND '2016-11-05'
                THEN 1 ELSE 0 END) AS "No of Tests in Range",
       COUNT(*) AS "Total No of Test"
FROM ALLPATIENTINFO
GROUP BY TestName

这将确保原始数据集中出现的每个测试名称也会出现在结果集中。

但是有一个问题。它没有显示常见测试名称之间的总和,我想显示实际的计数数字,而不是“1”。 - sufian ahmed
@sufianahmed 然后保留您最初拥有的 COUNT(*)。请查看我的更新答案。 - Tim Biegeleisen

0

您可以使用条件聚合:

SELECT TestName,
       SUM(CASE WHEN ReqDate BETWEEN '2016-11-04' AND '2016-11-05' THEN TestFee ELSE 0 END) AS TestFee ,
       SUM(CASE WHEN ReqDate BETWEEN '2016-11-04' AND '2016-11-05' THEN 1 ELSE 0 END) "No of Tests"
FROM  ALLPATIENTINFO 
GROUP BY  TestName;

如果您有一个包含所有测试列表的单独表格,您可以使用LEFT JOIN代替:
SELECT t.TestName, SUM(TestFee) AS TestFee ,
       COUNT(api.testname) "No of Tests"
FROM TESTS t LEFT JOIN
     ALLPATIENTINFO api
     ON t.testname = api.testname AND
        api.ReqDate BETWEEN '2016-11-04' AND '2016-11-05'
GROUP BY t.TestName;

这可能是一个更好的解决方案,因为它将包括所有测试,甚至那些从未进行过的测试。


但是有一个问题。它没有显示常见测试名称之间的总和,我想显示实际的计数数字,而不是“1”。 - sufian ahmed
@sufianahmed . . . 我花了一些时间才理解你的评论。第一个子查询中的 count() 应该改为 sum() - Gordon Linoff

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接