我的要求是在表中没有值时显示一条记录。我通过以下查询实现了:
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
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
编辑----------向外部查询添加了分组依据
解释有点奥秘,因为聚合查询在与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
子句会过滤掉所有行,因此不会返回任何行。