使用分组集返回总计0

时间:2019-01-11 16:15:23

标签: sql oracle10g

有行时,以下查询可完美运行。 输出为:

   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 )))

2 个答案:

答案 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中的值进行计数,那么在内部联接上将不会返回任何结果。如果更改为左外部连接,则结果将为零。

我已经在有和没有外部联接的情况下运行了此程序,但确实得到了零数,以通过外部联接返回。

无法让我的图片在线显示。这是它的快速链接。

https://imgur.com/4uzkoA6