我在一家卖艾比克斯的小公司工作。基本产品是一辆4.4Ah电池的自行车。作为一个选项,客户可以选择升级到7Ah电池。这就给我们留下了这样的产品名称:

eBike someName 4,4Ah restOfTheName
Upgrade 7Ah restOfTheName

现在,我想使用PostgreSQL表创建一个销售报告,如下所示:
id | orderNumber | date | articleID | clientID | quantity | value

我遇到的问题是,我无法将4,4Ah与7Ah“分离”为物理7Ah=eBike 4,4Ah,并进行7Ah升级。
我想根据所售自行车的电池类型对其进行分类。为此,我目前计划使用如下方法(当然要替换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"

现在我的问题是:有没有一种基于sum(quantity)的数学方法?
我可以想出另外两种方法来达到预期的效果:
使用orderNumber:如果4的orderNumber=7Ah的orderNumber,则=7Ah
使用子查询:从不包含7Ah的订单中选择4,4Ah。
也许我还能做点别的/更好的事?(对不起,我还是个初学者)
谢谢
编辑:附加信息
在上表中,“quantity”列已经是一个计数。有些行在每个orderNumber中占1个以上的项,因此使用4,4Ah - Upgrade函数比较复杂,最好执行COUNT()

最佳答案

这是一个有点黑暗的刺刀,因为我想看到一些实际的数据和期望的结果之前,我跳到任何结论。不管怎样,我认为您可能会受益于一个中间步骤,即创建一个“category”列,将每个记录放入一个有限的可能性列表中。从那里,您可以非常快速地扩展和创建数量、订单、行、收入等的分析。
下面是一个创建四个类别的快速示例,然后运行一些快速分析来查找各个类别的订单计数。

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

记住,在这个例子中,顺序计数是重叠的——但同样,一旦定义了类别,您就可以完全控制顺序计数了。

关于postgresql - PostgreSQL-案例中的数学,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/49382109/

10-08 22:09