通过返回0行进行分组

时间:2014-05-26 10:52:00

标签: oracle oracle11g

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

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

2 个答案:

答案 0 :(得分: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) ;

此查询将所有匹配的行(甚至无)视为单个组。即使没有符合的行,它也总会返回一行。这是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子句过滤掉,因此不会返回任何行。

答案 1 :(得分: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

编辑----------将分组添加到外部查询