【问题标题】:Postgresql Joining tables without losing recordsPostgresql 连接表而不丢失记录
【发布时间】:2020-07-21 03:18:15
【问题描述】:

假设我有以下表格:

1 - 起始库存

vendor | starting_stock
------------------------
adidas |    13
Reebok |    5

2 - 补货

vendor | restocks
-----------------
adidas |    2
nike   |    3

3 - 销售

vendor | quantity_sold
----------------------
adidas |    10
nike   |    1

我希望我的结果表是按供应商分组的销售渠道。在这种情况下,销售率的计算方式如下:quantity_sold/(starting_stock + restocks)。我唯一的问题是起始库存和补货表可能没有销售表中存在的一些供应商。所以在上面的场景中,StartingStock 没有nike 作为记录。因此,如果是这种情况,耐克的售价将只是 1/31/(3+0)。因此,我的结果表将是:

vendor | sell_through
---------------------
adidas |    1.5
nike   |   0.33
Reebok |    0

所以我希望所有供应商都出现在结果表中(如果没有销售额,则值为 0,如上面显示的 Reebok)。

我尝试使用不同类型的连接,但无法获得。任何帮助都会很棒。谢谢。

【问题讨论】:

  • 你有一个包含所有供应商的表吗?

标签: sql postgresql join


【解决方案1】:

我们可以在这里尝试完全外连接方法:

SELECT
    COALESCE(ss.vendor, r.vendor, s.vendor) AS vendor,
    COALESCE(s.quantity_sold, 0) /
        (COALESCE(ss.starting_stock, 0) + COALESCE(r.restocks, 0)) AS sell_through
FROM StartingStock ss
FULL OUTER JOIN Restock r ON ss.vendor = r.vendor
FULL OUTER JOIN Sales s ON s.vendor = COALESCE(ss.vendor, r.vendor)

Demo

请注意,我为阿迪达斯的销售量计算了 2/3,因为销售量为 10,库存总和为 15。

【讨论】:

    【解决方案2】:

    我会使用union all 和聚合:

    select vendor,
           sum(starting_stock), sum(restock), sum(quantity_sold),
           (sum(quantity_sold) * 1.0 / sum(starting_stock) + sum(restock)) as sell_through
    from ((select vendor, starting_stock, 0 as restock, 0 as quantity_sold
           from startingstock
          ) union all
          (select vendor, 0 as starting_stock, restock, 0 as quantity_sold
           from restock
          ) union all
          (select vendor, 0 as starting_stock, 0 as restock, quantity_sold
           from sales
          ) 
         ) v
    group by vendor;
    

    特别是,此版本在计算中只包含每个数字一次。如果供应商在任何表中有多行,JOIN 方法将产生不准确的结果。

    【讨论】:

    • 非常感谢您的回答。供应商每张表只有一条记录。但我很欣赏这个答案,当我使用更大的数据集时,会将它的速度与其他答案进行比较。
    • @tee 。 . .有了“补货”和“销售”之类的名称,我觉得这很令人惊讶。
    • 我简化了问题,但销售和补货表是我 group by vendor 的其他查询的结果
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-08-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多