Oracle 通过返回0行进行分组

Oracle 通过返回0行进行分组,oracle,oracle11g,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_TIMESTAM

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

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) ;
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) ;
现在我的问题是,当我在上面的查询结果中添加
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) ;
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

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

Edit------将GROUPBY添加到外部查询

解释有点晦涩,因为聚合查询在使用和不使用
GROUPBY
子句时存在不一致性。您的第一个查询是聚合查询:

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)
,因为它是一个“常量”(相对于查询)

添加
分组依据时,语义会发生变化。所以这个查询:

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
子句过滤掉,因此不会返回任何行。

要在表中没有值时显示一条记录,这意味着什么?没有值没有记录感谢您的响应…表没有记录。。。表是空的,在这种情况下,这一条记录应该包含什么?全部为零…用记录更新我的问题谢谢你的回答。。。但是在你的回答中没有GROUPBY子句。。。如何获得GROUPBY子句。我想在您的查询中不需要
GROUPBY
。您总是希望只检索一条记录谢谢您的回答。。对您的答案做了一些更改。。。现在我可以按
分组了。谢谢您的回复,先生。。这意味着group by应用于查询返回的记录,但应用于查询本身。。。我的意思是,查询是在数据库上启动的,而groupby是在查询的结果记录上。。我的理解正确吗?请提供您的答复。。感谢you@Siva . . .
group by
是在
where
子句之后(逻辑上)处理的,如果这是您的意思的话。谢谢,先生……是的,我理解的是group by应用于查询的结果输出,而不是数据库。我的理解正确吗?