我有以下查询:
SELECT DISTINCT col1
,date
,COUNT(*)
FROM table1
WHERE date = '2019-12-2'
GROUP BY col1, date
UNION
SELECT DISTINCT col2
,date
,COUNT(*)
FROM table2
WHERE date = '2019-12-2'
GROUP BY col2, date
如果第二个查询没有数据,我希望结果显示0。 喜欢:
Col1 date 15
Col2 date 0
我尝试使用用例,但不起作用。
答案 0 :(得分:0)
尝试使用类似IFNULL(COUNT(*), 0)
的名称。
https://www.w3schools.com/sql/sql_isnull.asp
答案 1 :(得分:0)
如果您使用的是Oracle 12或更高版本,则可以尝试以下查询-
SELECT DISTINCT col1
,date
,COUNT(*)
FROM table1
WHERE date = '2019-12-2'
GROUP BY col1, date
UNION
(SELECT 'col2' col2
,'date' date
,'0' CNT
UNION ALL
SELECT DISTINCT col2
,date
,COUNT(*)
FROM table2
WHERE date = '2019-12-2'
GROUP BY col2, date
ORDER BY CNT DESC
FETCH FIRST ONE ROW ONLY)
Similary对于SQL-SERVER,使用TOP,对于MySQL使用LIMIT 1等。
答案 2 :(得分:0)
您可以使用GROUP BY GROUPING SETS
子句进行分组。
UNION ALL
的第二部分可以如下重写。您可以按原样运行此查询,以使用不同的WHERE
子句对其进行测试。
这种分组形式将额外的“总计摘要”记录添加到带有表达式GROUPING(COL2)=1 AND GROUPING(DATE)=1
的结果集中,我们使用该记录将“额外”行与其他行区分开。如果仅显示记录COUNT(*)=0
,则表明没有返回任何组。
SELECT
CASE COUNT(*) WHEN 0 THEN 'COL2' ELSE col2 END AS col2
, CASE COUNT(*) WHEN 0 THEN '2019-12-2' ELSE date END AS date
, COUNT(*)
FROM
(
VALUES
('1', '2019-12-2')
, ('2', '2019-12-2')
) table2(col2, date)
WHERE
date = '2019-12-2'
--date = '2019-12-1'
GROUP BY GROUPING SETS((col2, date), ())
HAVING NOT (GROUPING(COL2)=1 AND GROUPING(DATE)=1 AND COUNT(*)<>0);
您可能会在GROUP BY子句说明中阅读有关GROUPING SETS
的更多信息。