有行时,以下查询可完美运行。 输出为:
Duplicates,2
Syntax,5
Total,7
但是我需要返回总计行,如果没有行,则返回0。
尝试将INNER JOIN更改为RIGHT JOIN,但是这将返回两行。 总计,0 总计,0
我可能可以使用它并在我的VB代码中剥离多余的代码,但想弄清楚如何在SQL中执行此操作。
SELECT
nvl(to_char(dbms_lob.substr(message, 50, 1 )),'Total') AS TYPE ,
Count(dbms_lob.substr( message, 50, 1 )) AS "HOWMANY"
FROM applicationlogentries ALE
INNER JOIN (
SELECT REFERENCE_ID , Max(entry_date) AS MaxDateTime
FROM APPLICATIONLOGENTRIES
where Trunc(entry_date) = Trunc(SYSDATE) -8
GROUP BY REFERENCE_ID) groupedAle
ON ale.reference_id = groupedAle.reference_id
AND ale.last_updated = groupedAle.MaxDateTime
AND ale.reference_id IN
(SELECT ID FROM documentsin
where Trunc(date_received) = Trunc(SYSDATE) -8 AND
status = 3)
group by grouping sets((),(dbms_lob.substr( message, 50, 1 )))
答案 0 :(得分:1)
这个评论太长了。
如果您运行:
select count(*)
from t;
然后,即使t
为空,您也将总是得到一行。那就是整个表上聚合的定义。
如果您运行:
select count(*)
from t
group by <whatever>
然后,每个组将获得一行。如果没有组(即表中没有数据),则不会获得任何行。
我想不出用group by
在空表上返回一行的方法。在这种情况下,是这样。
显然,
group by grouping sets ( () )
表现类似于第二种情况,而不是第一种情况。据说“有group by
,所以每组一行” 和“没有数据,所以没有组”。
我唯一能想到的解决方案是蛮力解决方案:union all
表示要计算的总数。
答案 1 :(得分:0)
您需要对数据执行左外部联接以获取零计数以返回。我发现此页面可以帮助我了解如何进行测试。我创建了几个虚拟表。如果您希望count(*)为您提供零值,则看来您必须在一个联接表中有记录。
How to include "zero" / "0" results in COUNT aggregate?
“之所以起作用,是因为外部(左侧)连接将 对于没有约会的人,返回NULL。的 聚合函数count()不会计算NULL值,因此您将 得到零。”
Select a.colA, count(b.ColA)
from [dbo].[SRJTestTable1] as a
Join [dbo].[SRJTestTable2] as b
ON a.ColA = b.ColA
Group by a.ColA
假设表1中有记录,而表2中没有,并且您想对表2中的值进行计数,那么在内部联接上将不会返回任何结果。如果更改为左外部连接,则结果将为零。
我已经在有和没有外部联接的情况下运行了此程序,但确实得到了零数,以通过外部联接返回。
无法让我的图片在线显示。这是它的快速链接。