多组和

时间:2016-01-24 08:20:24

标签: mysql group-by

下面是我的支付mysql 5.7.9表需要帮助写一个查询

付款

|s.no          |transaction   |order-id      |order-item-code|amount-type      |amount
-------------------------------------------------------------------------------------
|1             |Order         |1             |11             |ItemPrice        |200
|2             |Order         |1             |11             |ItemPrice        |100
|3             |Order         |1             |11             |ItemFees         |-12
|4             |Order         |1             |11             |ItemFees         |-1.74
|5             |Order         |1             |11             |ItemFees         |-10
|6             |Order         |1             |11             |ItemFees         |-1.45
|7             |Order         |1             |11             |ItemFees         |-4
|8             |Order         |1             |11             |ItemFees         |-0.58
|9             |Order         |1             |22             |ItemPrice        |150
|10            |Order         |1             |22             |ItemPrice        |50
|11            |Order         |1             |22             |ItemFees         |-12
|12            |Order         |1             |22             |ItemFees         |-1.74
|13            |Order         |1             |22             |ItemFees         |-10
|14            |Order         |1             |22             |ItemFees         |-1.45
|15            |Order         |1             |22             |ItemFees         |-4
|16            |Order         |1             |22             |ItemFees         |-0.58
|17            |Ship          |1             |               |other-transaction|-55
|18            |Ship Tax      |1             |               |other-transaction|-7.98
|19            |Order         |2             |33             |ItemPrice        |450
|20            |Order         |2             |33             |ItemPrice        |150
|21            |Order         |2             |33             |ItemFees         |-36
|22            |Order         |2             |33             |ItemFees         |-5.22
|23            |Order         |2             |33             |ItemFees         |-30
|24            |Order         |2             |33             |ItemFees         |-4.35
|25            |Order         |2             |33             |ItemFees         |-12
|26            |Order         |2             |33             |ItemFees         |-1.74
|27            |Ship          |2             |               |other-transaction|-55
|28            |Ship Tax      |2             |               |other-transaction|-7.98

预期结果

    |order-id       |order-item-code     |Received
    ---------------------------------------------
    |1              |11                  |238.74
    |1              |22                  |138.74
    |2              |33                  |447.71

计算逻辑:

sum(每个订单项代码的itemprice)+ sum(每个订单项代码的itemfees)+ sum(order-id的其他事务)/ order-item-id的order-id

其他交易是订单上收取的运费,我需要将其他交易的总和除以订单中存在的唯一商品。 在order-id-1的情况下,我们有2个项目作为仅两个项目id代码,在order-id -2的情况下,我们有一个项目。它是不存在的明显的order-item -code

1 个答案:

答案 0 :(得分:0)

您可以使用已加入的子查询,以便可以使用两个单独的GROUP BY

子查询计算“其他事务”(将它们相加并除以order_item_codes的数量),外部查询执行每个代码条目的正常总和,只需添加其部分常见事务;

SELECT p.order_id, p.order_item_code, SUM(p.amount) + z.other AS received
FROM payments p
JOIN (
  SELECT order_id, 
    SUM(CASE WHEN order_item_code = ''
             THEN amount 
             ELSE 0.0 END) / (COUNT(DISTINCT order_item_code) - 1) AS other 
  FROM payments
  GROUP BY order_id
) z
ON p.order_id = z.order_id
GROUP BY p.order_id, p.order_item_code
HAVING order_item_code <> ''

An SQLfiddle to test with

请注意,如果order_id上没有项目代码的“其他事务”条目,则此查询可能会失败,因为内部查询将尝试将公共开销分配给零代码。如果你需要这个,你需要弄清楚那种情况下的正确结果。

编辑:如果order-item_id为NULL,则查询会稍微改变一下;

SELECT p.order_id, p.order_item_code, SUM(p.amount) + z.other AS received
FROM payments p
JOIN (
  SELECT order_id, 
    SUM(CASE WHEN order_item_code IS NULL
             THEN amount 
             ELSE 0.0 END) / (COUNT(DISTINCT order_item_code)) AS other 
  FROM payments
  GROUP BY order_id
) z
ON p.order_id = z.order_id
GROUP BY p.order_id, p.order_item_code
HAVING order_item_code IS NOT NULL

请注意将比较更改为IS NULL / IS NOT NULL以及删除计数中的-1,因为空字符串 计算在{{1不是。

Another SQLfiddle