【问题标题】:Sum function in Case statementCase 语句中的 Sum 函数
【发布时间】:2017-11-21 09:24:05
【问题描述】:

我正在处理一个查询,我需要在各种条件下找到总和。现在我的查询是:

select
sum(case when condition then A_amount end) as S_A_amount,
sum(case when condition then B_amount end) as S_B_amount

但在第三种情况下,我还需要在 When 条件下使用 sum 函数

sum(case when sum(C_amount)>3 then 6 else sum(C_amount) end) as S_C_amount
from table A group by item

我无法实现第三个条件。我收到not a single group-by 错误。

【问题讨论】:

  • 请添加示例数据。
  • 为什么?不需要样品。只需要一个子查询来计算 SUM(C_amount)

标签: oracle sum case


【解决方案1】:

如果没有一些示例数据,很难确定您要达到的目标,但在 same 组中使用 SUM(SUM(value)) 不会与仅使用 SUM(value) 产生不同的结果,所以它看来您可以使用:

SQL Fiddle

Oracle 11g R2 架构设置:

CREATE TABLE A ( item, A_Amount, B_Amount, C_Amount, cond ) AS
SELECT 1, 1, 1, 1, 1 FROM DUAL UNION ALL
SELECT 1, 1, 1, 1, 2 FROM DUAL UNION ALL
SELECT 1, 1, 1, 1, 3 FROM DUAL UNION ALL
SELECT 1, 1, 1, 0, 4 FROM DUAL UNION ALL
SELECT 2, 2, 2, 2, 1 FROM DUAL UNION ALL
SELECT 2, 2, 2, 2, 2 FROM DUAL UNION ALL
SELECT 2, 2, 2, 2, 3 FROM DUAL UNION ALL
SELECT 2, 2, 2, 2, 4 FROM DUAL;

查询 1:

SELECT item,
       SUM( CASE WHEN cond > 0 THEN A_amount END ) AS S_A_amount,
       SUM( CASE WHEN cond > 0 THEN B_amount END ) AS S_B_amount,
       CASE WHEN SUM(C_amount)>3 THEN 6 ELSE SUM(C_amount) END AS S_C_amount
FROM   A
GROUP BY item

Results:

| ITEM | S_A_AMOUNT | S_B_AMOUNT | S_C_AMOUNT |
|------|------------|------------|------------|
|    1 |          4 |          4 |          3 |
|    2 |          8 |          8 |          6 |

【讨论】:

  • 总和在哪里?他需要总和的总和
  • @Thomas 在CASE 表达式中。 SUM 的 SUM 不会给出与仅使用 SUM 不同的值,如果这两种情况下的组相同 - 正如我在答案开始时评论的那样 - 所以不清楚为什么 OP认为他们需要SUM 两次。
  • 第三个 case 语句不是按函数分组的,我收到错误。
  • @SYMA 更新了一些示例数据 - 我无法复制您的错误。
  • @MT0:你能在第三个case语句中再引入一个条件吗?就像案例 WHEN SUM(C_amount)>3 and cond>0 then 6 else sum(C_amount) end as S_C_amount
【解决方案2】:

这是你需要的吗?

select case
          when sum_c_amount > 3 then
           6
          else
           sum_c_amount
       end as s_c_amount
  from (select sum(c_amount) as sum_c_amount
          from table a
         group by item) 

【讨论】:

    【解决方案3】:

    将现有查询移动到子查询中,并将案例表达式逻辑放在外部查询层中,例如

    select
           d.*
         , case when S_C_amount > 3 then 6 else S_C_amount end
    from (
          select
                item
              , sum(case when condition then A_amount end) as S_A_amount
              , sum(case when condition then B_amount end) as S_B_amount
              , sum(case when condition then C_amount end) as S_C_amount
          from t
          group by item
          ) d
    

    【讨论】:

    • 分组在哪里?
    【解决方案4】:

    我会这样做:

    SELECT item,
           sum(case when condition then A_amount end) as S_A_amount,
           sum(case when condition then B_amount end) as S_B_amount,
           sum(case when s_c_amount>3 then 6 else s_c_amount end) as S_C_amount
     FROM (select item,
                  A_amount,
                  B_amount,
                  sum(C_amount) over (partition by item) as s_c_amount
             from table A)
    GROUP BY item
    

    【讨论】:

    • 子查询将在每一行中包含SUM(C_Amount)(因为您正在使用带有OVER (PARTITION BY item) 的分析函数),然后在外部查询中将这些相加,您实际上是在执行SELECT COUNT(1) * SUM(C_Amount) AS S_C_Amount FROM table A GROUP BY item,其中不是OP想要的输出。您可能想在外部查询中使用MAX 而不是SUM。
    • 正如我在下面所说的,为什么会一样?如果他更改总和的值,并且在他对更改后的值求和后,它将不相等... ('myitem1', 0,1,3 );('myitem1', 0,1,2 );('myitem2' , 0,1,4 )--> 你的结果是 6,我的是 12
    • 为什么在第一次 SUM 之后数据会发生变化?
    • SQLFIDDLE 你在数次总和。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-17
    • 1970-01-01
    • 1970-01-01
    • 2020-04-01
    • 2017-05-11
    相关资源
    最近更新 更多