PostgreSQL - CASE中的数学

时间:2018-03-20 10:43:54

标签: postgresql math

我在一家销售电动自行车的小公司工作。基础产品是一辆4.4Ah电池的自行车。作为选项,客户可以选择升级到7Ah电池。这给我们留下了这样的产品名称:

eBike someName 4,4Ah restOfTheName
Upgrade 7Ah restOfTheName

现在我想使用PostgreSQL表创建一个销售报告,如下所示:

id | orderNumber | date | articleID | clientID | quantity | value

我遇到的问题是我不能分开'来自7Ah的4,4Ah作为物理7Ah = eBike 4,4Ah,7Ah升级。

我想根据电池类型制作sum(quantity)所有售出的自行车。为此,我目前计划使用类似以下方法的东西(当然要替换XXXXX):

SELECT
    CASE
        WHEN "articles__via__bc_2018_article"."article_name" LIKE 'Upgrade%' THEN '7Ah'
        WHEN "articles__via__bc_2018_article"."article_name" LIKE '%4,4Ah%' THEN XXXXXXXXXX
    END AS "Item",
    sum("public"."bc_2018"."bc_2018_quantity") AS "sum"

现在我的问题是:有没有办法根据4,4Ah - Upgrade做一些数学?

我可以考虑另外两种解决方案来获得想要的结果:

  1. 使用orderNumber:如果4,4Ah的orderNumber = 7Ah的orderNumber则= 7Ah
  2. 使用子查询:从不包含7Ah的订单中选择4,4Ah。
  3. 也许还有其他事情/我能做得更好? (抱歉,我还是初学者)

    非常感谢

    编辑:额外信息

    在上表中,'数量'列已经是一个计数。有些行每个orderNumber占一个以上的项目,因此使用COUNT()函数很复杂,最好执行SUM(quantity)

3 个答案:

答案 0 :(得分:0)

简单地从基础自行车中减去升级(使用子查询)。

SELECT "articles__via__bc_2018_article"."article_name" AS "Item",
    CASE
        WHEN "articles__via__bc_2018_article"."article_name" LIKE '%4,4Ah%' THEN SUM("articles__via__bc_2018_article"."article_name") - (SELECT SUM("articles__via__bc_2018_article"."article_name") FROM Orders WHERE "articles__via__bc_2018_article"."article_name" LIKE 'Upgrade%')
        ELSE SUM("articles__via__bc_2018_article"."article_name")
    END AS "Sum"
FROM Orders
GROUP BY "articles__via__bc_2018_article"."article_name";

答案 1 :(得分:0)

这在黑暗中有点刺痛,因为在我得出任何结论之前,我希望看到一些实际数据和预期结果。无论如何,我认为您可能会受益于创建"类别"的中间步骤。将每条记录放入有限可能列表的列。从那里,您可以非常快速地扩展和创建数量,订单,线路,收入等分析。

以下是创建四个类别然后运行一些快速分析以查找各种类别的订单计数的快速示例。

with categorized as (
  select
    a.*,
    case
      when a.article_name like '%4,4Ah%Upgrade%7Ah' then '7Ah Upgrade'
      when a.article_name like '7Ah' then '7Ah'
      when a.article_name like '4,4Ah' then '4,4Ah'
      else 'Unknown'
    end as category
  from articles a
)
select
  count (distinct order_number) filter (where category = '7Ah Upgrade') as upgrades,
  count (distinct order_number) filter (where category like '7Ah') as all_7ah,
  count (distinct order_number) filter (where category = '4,4Ah') as base_model
from categorized

请记住,在此示例中,订单计数重叠 - 但同样,在您定义类别后,您可以完全控制这些内容。

答案 2 :(得分:0)

感谢上面的答案,我找到了一些解决方法。

显然,PostgreSQL不接受docker run -p 127.0.0.1:27017:27017 --name some-mongo -d mongo 中的SUM()

这就是我决定使用以下Sum的原因(我知道这很恶心,但它确实有效):

CASE