【问题标题】:PostgreSQL: How to group similar data into one columnPostgreSQL:如何将相似的数据分组到一列
【发布时间】:2013-02-27 16:49:51
【问题描述】:

我正在搜索可以将相似数据分组到一列的查询。 基本上,我有一个代表订单项目的表格。每个订单商品都属于一个订单。一个订单项目有一个数量、每单位价格 (ppu)、ppu 的货币 (cur) 和一些其他成本(每个成本都有自己的货币)。成像,我在表中有以下数据:

id | id_order | amount | ppu | ppu_cur  | costsA | costsA_cur  | costsB | costsB_cur 
1  | Ord1     | 20     | 10  | EUR      | 5      | USD         | 15     | EUR
2  | Ord1     |  8     | 20  | EUR      | 0      |             | 15     | EUR
3  | Ord1     | 15     | 50  | USD      | 10     | USD         | 0      | 
4  | Ord2     | 50     | 25  | EUR      | 10,50  | EUR         | 15     | EUR

现在,我需要一个可以像这样对价格进行分组的查询:

id_order | curr | price_total
Ord1     | EUR  | 390
Ord1     | USD  | 505
Ord2     | EUR  | 1275,5

INFO:“0”价格或没有货币的价格应被忽略。

不幸的是,我只用 ppu 做到了这一点:

SELECT "sub"."id", "sub"."cur", SUM("sub"."price_total")
FROM (
  SELECT "ord"."id" AS "id", ("oi"."amount" * "oi"."ppu") AS "price_total", "oi"."cur" AS "cur"
  FROM "orders" "ord", "orderitems" "oi"
  WHERE
    ("oi"."id_order" = "ord"."id") AND
    (("oi"."cur" IS NOT NULL) AND ("oi"."cur" <> '')) AND
    ("oi"."price" <> 0)
  ) "sub"
GROUP BY "sub"."id", "sub"."cur"

有人知道如何解决这个问题吗?

提前致谢:)

编辑: 每个订单价格应根据货币计算,例如: “Ord1”中有两种不同的货币(欧元、美元)。因此,“Ord1”的结果必须有两行。 另一方面,“Ord2”中只有一种货币(欧元)。所以结果只包含“Ord2”的一行。

计算:必须添加相同货币的每个costX/ppu。此外,ppu 必须乘以数量。 “Ord1”示例:

EUR: (20 * 10 + 15) + (8 * 20 + 15)
USD: (5) + (15 * 50 + 10)

信息:示例中只有 2 种不同的货币。但是,可以有任意数量的货币。

【问题讨论】:

  • 您的查询到底有什么问题?你想让它做什么而不是做什么?既然你举了一个你想得到什么的例子,你能说明你得到了什么吗?
  • 更清楚地说明您的要求。听起来想将每单位价格(PPU)和单位数量(数量)相乘。您想为每个货币代码执行此操作。然后,您想将这些汇总为一个订单。最后,您希望在单独的 rcord 上进行每个货币计算。对吗?
  • 查询的问题是他们没有考虑成本(A和B)。
  • @user2116206 你一直在澄清这个问题,但我在下面的回答中没有得到任何评论。如果不正确,请告诉我我误解了什么。
  • 您好 Joachim,抱歉回复晚了。昨天晚上,我无法验证您的解决方案(仅回答一些问题)。不过,非常感谢您的回答!这似乎正是我正在寻找的查询。此外,感谢发布到 SQLfiddle 的链接。干得好:)

标签: sql postgresql


【解决方案1】:

每列有单独的货币会有点棘手,所以最简单的方法是制作一个 cte 来逐项列出价格并从中选择具有适当分组的总和;

WITH cte AS (
  SELECT id_order,ppu_cur curr,amount*ppu price FROM orderitems  -- amount*ppu
  UNION ALL
  SELECT id_order,"costsA_cur","costsA" FROM orderitems          -- costsA
  UNION ALL
  SELECT id_order,"costsB_cur","costsB" FROM orderitems          -- costsB
)
SELECT id_order,curr,SUM(price)
FROM cte
WHERE curr IS NOT NULL AND price<>0
GROUP BY id_order,curr

An SQLfiddle for testing.

【讨论】:

    【解决方案2】:

    你没有很好地解释逻辑,但我想我从结果中得到了它。

    试试这个:

    select id_order, curr, sum(amount*(ppu+AddedCost)) as price_total
    from (select t.*,
                 (case when ppu_cur = costsa_cur then costsa
                       when ppu_cur = costSB_cur then costsb
                       else 0
                  end) as AddedCost
          from t
         ) t
    group by id_order, curr
    

    我正在使用子查询使添加的成本计算更清晰。

    【讨论】:

    • 对不起,我刚刚更新了解释。参见“编辑”部分。据我所知,您的示例仅在 ppu 货币等于 costa_curr 或 costb_curr 时才有效。但是,可能每个 curr 列都有自己的货币。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-10-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-08-18
    • 2015-01-12
    • 1970-01-01
    相关资源
    最近更新 更多