下面是我的支付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
答案 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 <> ''
请注意,如果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不是。