我的要求是在表格中没有值时显示一条记录。我已经通过以下查询实现了:
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
答案 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
编辑----------将分组添加到外部查询