我是SQL的新手,希望对如何解决此问题有您的建议,
我按类型有销售信息
我想按类型对某些参考的价格求和,并基于结果的总和,从另一个表中获取值,然后在“输出”列中填充。
Group Type 100000 200000 300000
1 A 1 2 3
1 B 0 1 1
2 T 2 2 4
2 U 0 2 2
3 V 2 2 3
4 N 1 1 1
从上表2中,我们发现TYPE A和B属于同一组-组1。因此,在第一个表中,查询应该对属于组1的引用的价格求和。如果总和> 100000,并且<= 200000,然后必须根据类型选择相应的值。
如果基于组的价格总和小于100000或表2中未找到类型,则应采用下表中的值
[+------+----+---+
| Type | 1 | 2 |
+------+----+---+
| A | 50 | 2 |
| B | 60 | 5 |
| C | 65 | 2 |
| D | 65 | 3 |
| E | 65 | 4 |
+------+----+---+][3]
因此,以上数据表的最终输出如下所示,
Order ID Reference Type Price Output
101 AAA A 500000 3
101 AAB B 100000 1
101 ABC C 20000 67
101 DCE B 50000 1
101 BOD D 200000 68
101 ZYZ E 200000 69
102 AAA A 20000 52
因此,对于第一行,它的TYPE A和Type A出现在Group 1下,而在Group1中我们也拥有Type2。因此,对于相同的订单ID 101,Type A和B的总销售额为650000> 300000,因此,对于类型A,我们从表2中选择值3。由于表2中不存在类型C,因此我转到表3,并添加了两个值,依此类推
很抱歉,很长的帖子。希望我的问题清楚吗?希望有您的专家意见。
谢谢, SS
答案 0 :(得分:0)
加入所有表,并确保您执行LEFT JOIN
,因为我们希望保留第一张表中的记录,即使第二张或第三张表中没有相应的数据。
要获得总数,请优先考虑第二张表,请使用case when
来验证此mrp
字段在哪个范围内。如果位于第二个表的选择范围之内,否则从第三个表的选择计数。
SELECT
s.order_id,
s.reference,
s.`type`,
s.mrp,
@a:= IFNULL(g_total.Total, s.mrp) AS MRP_Total, -- @a variable to use it in CASE WHEN clause
CASE
WHEN @a > 100000 AND @a <= 200000 AND sg.`type` IS NOT NULL THEN sg.price_100000
WHEN @a > 200000 AND @a <= 300000 AND sg.`type` IS NOT NULL THEN sg.price_200000
WHEN @a > 300000 AND sg.`type` IS NOT NULL THEN sg.price_300000
ELSE tp.price_1 + tp.price_2
END Total
FROM sales s
LEFT JOIN sales_group sg ON s.`type` = sg.`type`
LEFT JOIN type_prices tp ON s.`type` = tp.`type`
LEFT JOIN (
SELECT
s.order_id, sgg.`group`, SUM(mrp) as Total
FROM sales s
INNER JOIN sales_group sgg ON s.`type` = sgg.`type`
GROUP BY s.order_id, sgg.`group`
) AS g_total -- Temp table to find total MRP, order and group wise
ON s.order_id = g_total.order_id AND sg.`group` = g_total.`group`
ORDER BY s.order_id, s.`type`;
输出:
sales
---
| order_id | reference | type | mrp | MRP_Total | Total |
---------------------------------------------------------
| 101 | AAA | A | 500000 | 650000 | 3 |
| 101 | DCE | B | 50000 | 650000 | 1 |
| 101 | AAB | B | 100000 | 650000 | 1 |
| 101 | ABC | C | 200000 | 200000 | 67 |
| 101 | BOD | D | 200000 | 200000 | 68 |
| 101 | ZYZ | E | 200000 | 200000 | 69 |
| 102 | AAA | A | 20000 | 20000 | 52 |
注意:sg.type IS NOT NULL
子句中添加了CASE WHEN
,因为如果第二张表中没有任何映射,则应移至引用第三张表的ELSE
部分。