查询结果总和的查询参考表

时间:2019-09-04 23:08:21

标签: mysql sql

我是SQL的新手,希望对如何解决此问题有您的建议,

我按类型有销售信息

enter image description here

我想按类型对某些参考的价格求和,并基于结果的总和,从另一个表中获取值,然后在“输出”列中填充。

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

1 个答案:

答案 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部分。