【问题标题】:Postgresql SUM with filter group column带有过滤器组列的 Postgresql SUM
【发布时间】:2021-12-27 12:26:42
【问题描述】:

我有这个关系数据模型

product_table

ID type configurable_product_id
1 CONFIGURABLE null
2 SIMPLE 1
3 SIMPLE 1
4 SIMPLE 1

product_source

ID product_id quantity
1 2 50
2 3 20
3 4 10

包含产品列表的表格,有两种类型:可配置和简单。简单产品链接到可配置产品。 包含不同产品数量的 product_source 表。 我想通过以下方式查询以检索产品的所有数量: 如果是可配置产品,那么数量是简单产品数量的总和 如果是简单产品,那么它只是简单产品的数量。

这是使用上述数据的预期结果:

结果

product_id quantity
1 80
2 50
3 20
4 10

你知道如何进行吗?

暂时想到了这种类型的请求,但不知道如何完成'CONFIGURABLE'案例

SELECT 
pr.id, 
pr.type, 
pr.configurable_product_id,
CASE
    WHEN (pr.type = 'SIMPLE') THEN ps.quantity
    WHEN (pr.type = 'CONFIGURABLE') THEN (????)
END AS quantity
FROM public."product" as pr
LEFT JOIN public."product_source" as ps
ON ps.product_id = pr.id

【问题讨论】:

    标签: sql postgresql join sum


    【解决方案1】:

    您可以使用window functionpartition 来计算sum 的数量(就像group by

    demo

    SELECT 
      pr.id AS product_id,
      CASE
        WHEN (pr.type = 'SIMPLE') THEN ps.quantity
        WHEN (pr.type = 'CONFIGURABLE') THEN SUM(ps.quantity) over ()
      END AS quantity
    FROM public."product" as pr
    LEFT JOIN public."product_source" as ps
    ON ps.product_id = pr.id
    ORDER BY pr.id
    

    【讨论】:

    • 这个解决方案比来自 Hashed Tomato 的解决方案更快吗?
    • 这可能更快,因为不要检查每一行中的case 条件。您可以检查explain 并比较两个查询
    • 当产品表包含多个可配置产品时,此代码不起作用不是吗?
    • 是的,它可能不起作用。它取决于数据和条件。使用 windows 功能时,您应该关心分区和过滤器。也许如果附加更多数据可以改善查询
    【解决方案2】:

    您的 (...) 是:

    (
      SELECT SUM(ps2.quantity) 
      FROM product as pr2
      LEFT JOIN product_source as ps2
      ON ps2.product_id = pr2.id
      WHERE pr2.configurable_product_id = pr.id
    )
    

    【讨论】:

    • 工作正常,谢谢!
    猜你喜欢
    • 2020-06-07
    • 1970-01-01
    • 1970-01-01
    • 2020-09-05
    • 1970-01-01
    • 2011-11-19
    • 2018-08-19
    • 2018-01-12
    • 1970-01-01
    相关资源
    最近更新 更多