通过返回0行分组

问题描述 投票:0回答:2

我的要求是在表中没有值时显示一条记录。我通过以下查询实现了:

SELECT   TRUNC (SYSDATE - 1) DATE1,
           NVL(AVG (column1),0) col1,
           NVL(AVG (column2),0) col2,
           COUNT ( * ) TOTAL
               FROM   table1
   WHERE column3 = 0  AND TRUNC (UTC_TIMESTAMP + TZ_OFFSET / 24) = TRUNC (SYSDATE - 1) ;

现在我的问题是,当我向上述查询结果添加groupby子句时,返回的是0记录。

更改的查询

我的要求是在表中没有值时显示一条记录。我通过以下查询实现了:

SELECT   TRUNC (SYSDATE - 1) DATE1,
           NVL(AVG (column1),0) col1,
           NVL(AVG (column2),0) col2,
           COUNT ( * ) TOTAL
               FROM   table1
   WHERE column3 = 0  AND TRUNC (UTC_TIMESTAMP + TZ_OFFSET / 24) = TRUNC (SYSDATE - 1) 
GROUP BY   TRUNC (SYSDATE - 1) ;

现在,我对此行为感到困惑。为什么我会有这种奇怪的行为?

25-05-2014 0 0 0

oracle oracle11g
2个回答
0
投票
select  TRUNC (SYSDATE - 1) d,
        col1,
        col2,
        total
from (
   SELECT  NVL(AVG (column1),0) col1,
           NVL(AVG (column2),0) col2,
           COUNT (* ) TOTAL
   FROM   table1
   WHERE column3 = 0  AND TRUNC (UTC_TIMESTAMP + TZ_OFFSET / 24) = TRUNC (SYSDATE - 1))
group by TRUNC (SYSDATE - 1),
            col1,
            col2,
            total

编辑----------向外部查询添加了分组依据


1
投票

解释有点奥秘,因为聚合查询在与group by子句一起使用或不一起使用时都具有不一致的地方。您的第一个查询是聚合查询:

SELECT TRUNC(SYSDATE - 1) as DATE1, NVL(AVG (column1),0) as col1, NVL(AVG (column2),0) as col2,
       COUNT ( * ) TOTAL
FROM   table1
WHERE column3 = 0  AND TRUNC(UTC_TIMESTAMP + TZ_OFFSET / 24) = TRUNC(SYSDATE - 1) ;

此查询将all个匹配行(甚至没有)视为一个组。它总是返回一行,即使没有行匹配,也是如此。这是COUNT(*)可以返回0的时候。顺便说一下,您可以包含TRUNC(SYSDATE - 1),因为它是“常量”(相对于查询)。

当添加group by时,语义会发生变化。所以这个查询:

SELECT TRUNC(SYSDATE - 1) as DATE1, NVL(AVG (column1),0) as col1, NVL(AVG (column2),0) as col2,
       COUNT ( * ) TOTAL
FROM table1
WHERE column3 = 0  AND TRUNC(UTC_TIMESTAMP + TZ_OFFSET / 24) = TRUNC(SYSDATE - 1)
GROUP BY TRUNC(SYSDATE - 1) ;

此查询返回由group by表示的每个组。如果没有组,则不返回任何行。在这种情况下,where子句会过滤掉所有行,因此不会返回任何行。

© www.soinside.com 2019 - 2024. All rights reserved.