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

Oracle中不同条件下相同列的总和,oracle,oracle11g,sum,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 我想要三

我有一张这样的桌子:

 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
我想要三个和值:

  • 汇总特定子项和Loc的所有类型

  • 仅针对特定子项和Loc的类型1,4求和

  • 特定项目和Loc的类型1,4之和

     Item | SubItem | Loc | Sum1 | Sum2 | Sum3 
    
     D1   | SD1 | L1 | 30 | 20 | 55
    
     D1   | SD1 | L1 | 25 | 15 | 55
    

  • 我的表中有各种项目、子项目和loc的组合。

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

    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:每个项目、子项目和loc的所有类型的QTY之和
    • sum2:每个项目、子项目和loc的类型1和类型4的QTY之和
    • sum3:所有QTY的总和(实际上是SUM1的总和)

    这不是你的问题所说的你想要的,而是你所给出的预期结果。如果不是你想要的,你应该能够调整它以得到你真正需要的。

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

    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:每个项目、子项目和loc的所有类型的QTY之和
    • sum2:每个项目、子项目和loc的类型1和类型4的QTY之和
    • sum3:所有QTY的总和(实际上是SUM1的总和)

    这不是你的问题所说的你想要的,而是你所给出的预期结果。如果它不是您想要的,您应该能够调整它以获得您真正需要的。

    使用来自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
    

    使用来自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
    


    Sum3不应该是45,因为其中一项是类型5?是55不正确。在特定Loc的所有子项目中,它实际上应该是35(类型1+类型4)。Sum3不应该是45,因为其中一个项目是类型5?是55不正确。它实际上应该是35(类型1+类型4)的所有子项目@特定Loc。谢谢你,我想要你显示的金额。但是在我的表中还有一些额外的列,我不想包含在GROUPBY子句中。有没有办法选择附加列和求和值?您需要更新您的问题,以提供更多信息,明确您的目标。(例如,您的示例数据只有一个项目和两个子项目;可能还有其他项目;一个子项目是否属于不同的项目?等等)可以有多个项目和子项目,但一个子项目只能链接到一个项目。我想显示的项目/子项目的其他属性中的其他列,但这些列不用于合计数量。如果有多个项目,此代码是否有效?SUM(SUM(当输入('Type1','Type4'),然后是qty END)OVER()时,是否会对表中的所有项目和位置进行加法?但是,我希望sum3作为一个特定项的所有子项和位置(类型为1和4)的聚合。您只需将
    按项划分
    添加到
    over()
    中即可。如果你不熟悉分析函数,我强烈建议你研究它们;知道它们很方便。谢谢你,我想要你显示的总数。但是在我的表中还有一些额外的列,我不想包含在GROUPBY子句中。有没有办法选择附加列和求和值?您需要更新您的问题,以提供更多信息,明确您的目标。(例如,您的示例数据只有一个项目和两个子项目;可能还有其他项目;一个子项目是否属于不同的项目?等等)可以有多个项目和子项目,但一个子项目只能链接到一个项目。我想显示的项目/子项目的其他属性中的其他列,但这些列不用于合计数量。如果有多个项目,此代码是否有效?SUM(SUM(当输入('Type1','Type4'),然后是qty END)OVER()时,是否会对表中的所有项目和位置进行加法?但是,我希望sum3作为一个特定项的所有子项和位置(类型为1和4)的聚合。您只需将
    按项划分
    添加到
    over()
    中即可。如果你不熟悉分析函数,我强烈建议你研究它们;知道它们非常方便。如上所述重新发布我的评论:-如果有多个项目,这段代码有效吗?SUM(SUM(当输入('Type1','Type4'),然后是qty END)OVER()时,是否会对表中的所有项目和位置进行加法?但是,我希望sum3作为特定项目的所有子项和位置(类型为1和4)的聚合Item@sqlpractice使用分区-更新答案。博内斯特在他的评论中首先得到了答案,所以如果你满意的话,你应该接受他的答案:)谢谢。你能给我解释一下吗。在sum1和sum2中使用partition by会出现错误“not a GROUP by expression”为什么我不能在sum1和sum2中使用partition by。我已经得到了问题的答案,但还需要进一步的理解。如果您能解释一些问题,例如为什么它不接受其他和值中的分区,如何选择表中的其他列,我将不胜感激?有没有其他方法来替换Group by并仍然获得所需的结果?如果您在()sum1上键入sum(qty),那么您将得到您所说的错误。它之所以发生,是因为它不再将您的函数视为聚合,因为您告诉它对每一行求和。这就是为什么()上的sum(sum(qty))可以工作的原因—(在这里,按分区非常有用)。。希望我的解释有道理,我相信你的解释有道理。您还可以帮助我了解是否有一种方法可以选择其他COL以及上面的总和结果。如上所述重新发布我的评论:-如果有多个项目,此代码是否有效?将求和