Oracle中不同条件下相同列的总和

时间:2018-04-13 06:52:01

标签: oracle oracle11g sum

我有一个像这样的表:

 Item  |SubItem| Loc | Type | Qty

 D1    | SD1   |L1  | Type1 | 10

 D1    | SD1   |L1  | Type2 | 10

 D1    | SD1   | L1 |Type 4 |10

 D1    | SD2   |L1  |Type4 | 5

 D1    | SD2   |L1  | Type5| 10

 D1    | SD2   | L1 | Type1 | 10

我想要三个SUM值:

  1. 总结特定子项目的所有类型&同上。

  2. 对于特定的SubItem&和,只对类型1,4求和。同上。

  3. 特定物品的类型1,4的总和& Loc

     Item | SubItem | Loc | Sum1 | Sum2 | Sum3 
    
     D1   | SD1 | L1 | 30 | 20 | 55
    
     D1   | SD1 | L1 | 25 | 15 | 55
    
  4. 我在桌子上有各种项目,子项目,loc的组合。

2 个答案:

答案 0 :(得分:2)

这可以通过聚合查询(包括条件求和)和分析函数轻松完成,如下所示:

WITH your_table AS (SELECT 'D1' item, 'SD1' subitem, 'L1' loc, 'Type1' TYPE, 10 qty FROM dual UNION ALL
                    SELECT 'D1' item, 'SD1' subitem, 'L1' loc, 'Type2' TYPE, 10 qty FROM dual UNION ALL
                    SELECT 'D1' item, 'SD1' subitem, 'L1' loc, 'Type4' TYPE, 10 qty FROM dual UNION ALL
                    SELECT 'D1' item, 'SD2' subitem, 'L1' loc, 'Type4' TYPE, 5 qty FROM dual UNION ALL
                    SELECT 'D1' item, 'SD2' subitem, 'L1' loc, 'Type5' TYPE, 10 qty FROM dual UNION ALL
                    SELECT 'D1' item, 'SD2' subitem, 'L1' loc, 'Type1' TYPE, 10 qty FROM dual)
SELECT item,
       subitem,
       loc,
       SUM(qty) sum1,
       SUM(CASE WHEN TYPE IN ('Type1', 'Type4') THEN qty END) sum2,
       SUM(SUM(qty)) OVER () sum3
FROM   your_table
GROUP BY item,
         subitem,
         loc;

ITEM SUBITEM LOC       SUM1       SUM2       SUM3
---- ------- --- ---------- ---------- ----------
D1   SD1     L1          30         20         55
D1   SD2     L1          25         15         55

返回:

  • sum1:每个项目的所有类型的qtys之和,subitem和loc
  • sum2:每个项目,子项目和地点的类型1和4的qtys总和
  • sum3:所有qtys的总和(实际上是sum1s的总和)

这不是你的问题所说的你所说的,但这是你给出的预期输出。你应该能够调整它以获得你真正需要的东西,如果它不是你想要的那样。

答案 1 :(得分:0)

使用Boneist的代码我改变了最后一个聚合,以便在SUM3中获得正确的值。

WITH your_table AS (SELECT 'D1' item, 'SD1' subitem, 'L1' loc, 'Type1' TYPE, 10 qty FROM dual UNION ALL
                    SELECT 'D1' item, 'SD1' subitem, 'L1' loc, 'Type2' TYPE, 10 qty FROM dual UNION ALL
                    SELECT 'D1' item, 'SD1' subitem, 'L1' loc, 'Type4' TYPE, 10 qty FROM dual UNION ALL
                    SELECT 'D1' item, 'SD2' subitem, 'L1' loc, 'Type4' TYPE, 5 qty FROM dual UNION ALL
                    SELECT 'D1' item, 'SD2' subitem, 'L1' loc, 'Type5' TYPE, 10 qty FROM dual UNION ALL
                    SELECT 'D1' item, 'SD2' subitem, 'L1' loc, 'Type1' TYPE, 10 qty FROM dual)
SELECT item,
       subitem,
       loc,
       SUM(qty) sum1,
       SUM(CASE WHEN TYPE IN ('Type1', 'Type4') THEN qty END) sum2,
       SUM(SUM(CASE WHEN TYPE IN ('Type1', 'Type4') THEN qty END)) OVER (PARTITION BY item) sum3
FROM   your_table
GROUP BY item,
         subitem,
         loc;

ITEM SUBITEM LOC       SUM1       SUM2       SUM3
---- ------- --- ---------- ---------- ----------
D1   SD1     L1          30         20         35
D1   SD2     L1          25         15         35