PostgreSQL - 案例中的数学



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

eBike someName 4,4Ah restOfTheName
Upgrade 7Ah restOfTheName

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

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

我遇到的问题是我无法将 4,4Ah 与 7Ah "分开",因为物理 7Ah = 电动自行车 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做一些数学?

我可以想到另外 2 种解决方案来获得想要的结果:

  1. 使用订单号:如果 4,4Ah 的订单编号 = 7Ah 的订单编号,则 = 7Ah
  2. 使用子查询:从不包含 7Ah 的订单中选择 4,4Ah。

也许还有其他事情/我能做得更好?(对不起,我还是初学者)

多谢

编辑:额外信息

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

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

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

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

请记住,在此示例中,顺序计数重叠 - 但同样,一旦您定义了类别,您就可以完全控制这一点。

只需从基础自行车中减去升级(带有子查询)。

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";

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

显然,PostgreSQL不接受CASE中的SUM()

这就是为什么我决定使用以下 Sum 的原因(我知道这很恶心 - 但它有效):

SELECT
(SELECT 
sum("public"."bc_2018"."bc_2018_quantity")
FROM "public"."bc_2018"
LEFT JOIN "public"."articles" "articles__via__bc_2018_article" ON "public"."bc_2018"."bc_2018_article" =        "articles__via__bc_2018_article"."article_id"
WHERE (("articles__via__bc_2018_article"."article_name" LIKE '%4,4Ah%')) -
(SELECT 
sum("public"."bc_2018"."bc_2018_quantity")
FROM "public"."bc_2018"
LEFT JOIN "public"."articles" "articles__via__bc_2018_article" ON "public"."bc_2018"."bc_2018_article" =        "articles__via__bc_2018_article"."article_id"
WHERE (("articles__via__bc_2018_article"."article_name" LIKE 'Upgrade_7Ah%'))

最新更新