当select语句不返回数据时,有什么办法显示0?

时间:2019-12-09 17:40:04

标签: sql db2

我有以下查询:

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  

我尝试使用用例,但不起作用。

3 个答案:

答案 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的更多信息。