按照显示模式将缺失的行(零值)插入表中

Posted

技术标签:

【中文标题】按照显示模式将缺失的行(零值)插入表中【英文标题】:Insert missing rows (with zero values) into table, following a display pattern 【发布时间】:2014-11-21 12:27:59 【问题描述】:

我正在创建一个循环遍历下表以创建报告的过程:

INSERT INTO temp_data
SELECT val_year, val_name, Group_A, Group_B, Group_C, SUM(product_count) AS in_stock
FROM all_products
GROUP BY val_year, val_name, Group_A, Group_B, Group_C;

Resulting rows:
1: 2014, product_a, food, hot, delicious, 50
2: 2014, product_a, food, hot, fast, 30
3: 2014, product_a, food, cold, delicious, 10
4: 2014, product_a, drinks, hot, delicious, 20
5: 2014, product_a, drinks, cold, delicious, 40
6: 2014, product_a, drinks, cold, fast, 60

7: 2014, product_b, food, hot, delicious, 70
... etc.

表 all_products 之前已通过各种 UNION ALL 查询等创建。

我现在需要将这些结果报告给我的上级,但该表看起来有“缺失”值。我需要重建该表,以便它显示缺失值为零的组。

我需要以某种模式显示所有值,这个例子就是我想要的显示:

Rows:
1: 2014, product_a, food, hot, delicious, 50
2: 2014, product_a, food, hot, fast, 30
3: 2014, product_a, food, cold, delicious, 10
4: 2014, product_a, food, cold, fast, 0
5: 2014, product_a, drinks, hot, delicious, 20
6: 2014, product_a, drinks, hot, fast, 0
7: 2014, product_a, drinks, cold, delicious, 40
8: 2014, product_a, drinks, cold, fast, 60

9: 2014, product_b, food, hot, delicious, 70
... etc.

注意第 4 行和第 6 行已填充,以显示无库存产品的零值。

是否有任何简单(快速)的方法来填充缺失的行?我能想到的只是一个巨大的 200 多行 FOR LOOP,它遍历当前组,检查组更改并在组更改时附加缺失的组。这种方法感觉有点不专业。

【问题讨论】:

【参考方案1】:

您可以通过首先生成所有行(使用cross join)然后引入值来做到这一点:

select y.val_year, g.val_name, g.Group_A, g.Group_B, g.Group_C,
       coalesce(in_stock, 0) as in_stock
from (select distinct val_year from temp_data) y cross join
     (select distinct val_name, Group_A, Group_B, Group_C from temp_data) g left join
     temp_data d
     on d.val_year = y.val_year and
        d.val_name = g.val_name and
        d.Group_A = g.Group_A and
        d.Group_B = g.Group_B and
        d.Group_C = g.Group_C;

您也可以直接在all_products 上执行此操作。例如,您可以将 CTE 添加到上述查询中:

with temp_data as (
      SELECT val_year, val_name, Group_A, Group_B, Group_C, SUM(product_count) AS in_stock
      FROM all_products
      GROUP BY val_year, val_name, Group_A, Group_B, Group_C
     )

【讨论】:

谢谢您,先生。任何想深入了解解决方案的人,我在这里发现了一些额外的东西:weblogs.sqlteam.com/jeffs/archive/2005/09/12/7755.aspx

以上是关于按照显示模式将缺失的行(零值)插入表中的主要内容,如果未能解决你的问题,请参考以下文章

在分组后为缺失的行添加零值

通过单击编辑按钮在引导模式中显示特定的行数据

是否有一个聪明的 HBase 模式来帮助发现缺失值?

将列表中的缺失元素作为每个时间窗口组的行插入到 DataFrame

为啥有的页码不显示?

如何将 SQL 表中的行数显示到 HTML 容器