【问题标题】:How to display count() with rows equal to zero with a single table如何使用单个表显示行数为零的 count()
【发布时间】:2019-08-14 23:32:13
【问题描述】:

所以基本上,假设我有一个名为“销售”的表格,列出了商店的每笔销售。

为简单起见,我们将保留三列:

 SALE_ID    DATE_SALE     VENDOR    

1   101     2019/01/01      Camille 
2   102     2019/01/01      Lucas
3   103     2019/01/02      Rudy   
4   104     2019/01/01      Lucas
5   105     2019/01/01      Delphine
6   106     2019/01/03      Penelope
7   107     2019/01/02      Rudy
8   108     2019/01/03      Delphine
9   109     2019/01/03      Camille   
10  110     2019/01/04      Rudy
11  111     2019/01/02      Camille
12  112     2019/01/04      Penelope

我只是想总结给定时间段内每个供应商的销售额。所以我很自然地尝试使用带有“分组依据”指令的 count() 函数:

select vendor, count(vendor)
from sales 
where vendor in ('Camille', 'Lucas', 'Delphine', 'Rudy', 'Penelope', 'Alice')
group by vendor    
order by vendor;

输出如下:

    VENDOR      COUNT(VENDOR)       

1   Camille     3   
2   Delphine    2
3   Lucas       2   
4   Penelope    2
5   Rudy        3

您可能已经注意到,查询中还有一个名字,我要求她在计数列中显示为 0。

我看到许多主题相同的主题,但它们都依赖于几个表,并且解决方案总是暗示某种外连接。我只有一张桌子,而且它是我唯一可以使用的桌子,所以很遗憾,这个解决方案不适用。

各位好心人有什么替代方案可以推荐吗?

非常感谢您抽出宝贵的时间

【问题讨论】:

  • 您应该有一张包含所有供应商的表格。它的名称和结构是什么?

标签: sql oracle


【解决方案1】:

我会像这样加入vendors 表:

select v.vendor, count(s.vendor)
  from vendors v left outer join sales s on (s.vendor = v.vendor)
 where v.vendor in ('Camille', 'Lucas', 'Delphine', 'Rudy', 'Penelope', 'Alice')
 group by v.vendor
 order by v.vendor;

假设您有一个名为 vendors 的表,其中包含所有供应商(包括 Alice)。

【讨论】:

  • 您需要从vendorsleft join 开始到sales...或者您可以使用right join,但我觉得这些不太直观...
【解决方案2】:

鉴于您认为您不能拥有vendors 表,这是一种替代方法,基本上为您创建一个表,然后使用outer join 包含Alice

select t.name, count(s.vendor) as thecount
from (select column_value name 
      from table(sys.dbms_debug_vc2coll('Camille', 'Lucas', ..., 'Alice'))) t
  left join sales s on t.name = s.vendor
group by t.name

请注意,有几种不同的方法可以创建假表。这使用了您应该有权访问的内置过程。或者,您可以更明确地使用union all 定义它。

【讨论】:

    【解决方案3】:

    假设您没有VENDOR 表,您可以使用内联视图来生成您的供应商名称:

    WITH cteVendors as (SELECT 'Camille' AS VENDOR FROM DUAL UNION ALL
                        SELECT 'Lucas' AS VENDOR FROM DUAL UNION ALL
                        SELECT 'Delphine' AS VENDOR FROM DUAL UNION ALL
                        SELECT 'Rudy' AS VENDOR FROM DUAL UNION ALL
                        SELECT 'Penelope' AS VENDOR FROM DUAL UNION ALL
                        SELECT 'Alice' AS VENDOR FROM DUAL)
    SELECT v.VENDOR, COUNT(s.VENDOR)
      FROM cteVendors v
      LEFT OUTER JOIN SALES s
        ON s.VENDOR = v.VENDOR
      GROUP BY v.VENDOR
      ORDER BY v.VENDOR
    

    dbfiddle here

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2010-12-08
      • 1970-01-01
      • 2011-12-14
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-09-10
      • 2015-07-07
      相关资源
      最近更新 更多