【问题标题】:SQL Select - SUM the value from the row on which Grouping is being done and from the previous rowSQL Select - 对正在进行分组的行和上一行的值求和
【发布时间】:2018-03-21 09:21:04
【问题描述】:

我有这个数据的表格。

ID  IMPACT  TICKETID     OWNER    OWNERGROUP
1   1       TICKET1001            GROUP1
2   2       TICKET1001   USER1
3   3       TICKET1001   USER1
4   4       TICKET1001            GROUP1
5   5       TICKET1001   USER2   
6   6       TICKET1001            GROUP1
7   7       TICKET1001   USER1
8   8       TICKET1002            GROUP1
9   9       TICKET1003            GROUP1
10  10      TICKET1003   USER1

我想根据所有工单的 OWNER 列 IMPACT 值进行总结,并且我知道该怎么做。

SELECT OWNER, SUM (IMPACT)
FROM TABLE
WHERE OWNER IS NOT NULL
GROUP BY OWNER

所以这种情况下的结果是:

USER1 22  (2+3+7+10)
USER2 5   (5)

但是,我还需要从前一行中获取值,其中用户不是票证的所有者,但在那一行之后他获得了所有权。 票证总是首先委托给组 (GROUP1),然后用户获得所有权。 所以这意味着我应该计算来自 ID 1 和 6 和 9 的 USER1 值(因为他是这些行之后的下一个第一个所有者)和来自 ID 4 的 USER2 值(因为 USER2 是第一个下一个所有者票)。

所以我分组的最终结果应该是:

USER1 38  (1+2+3+6+7+9+10)
USER2 9   (4+5)

TICKET1002 根本没有 OWNER 值,所以不应该计算在内!!!

可以这样计算吗?

提前谢谢你

【问题讨论】:

  • 发问题时,请提供创建表和插入数据的命令

标签: sql select group-by count db2


【解决方案1】:

只需使用lag():

select owner,
       (sum(impact) +
        coalesce(sum(case when prev_owner is null then prev_impact end), 0)
       ) as impact
from (select t.*,
             lag(impact) over (order by id) as prev_impact,
             lag(owner) over (order by id) as prev_owner
      from t
     ) t
where owner is not null
group by owner;

【讨论】:

  • 谢谢你,戈登,你真是个天才!
【解决方案2】:

以下是您的问题的解决方案:

SELECT Owner, SUM(Impact)
FROM
(
  SELECT 
  @id:=ID, IMPACT, TICKETID,
  CASE WHEN OWNER IS NULL 
          THEN (SELECT OWNER FROM TABLE1 WHERE ID = @id + 1  AND OWNERGROUP IS NULL)
       ELSE
          OWNER
       END AS OWNER,
  OwnerGroup
FROM Table1 AS s
 ) AS t
WHERE OWNER IS NOT NULL
Group BY OWNER; 

输出:

Owner   SUM(Impact)
USER1   38
USER2   9

这是演示的链接:

http://sqlfiddle.com/#!9/5a614b/22

【讨论】:

  • 嗨 Jay,我正在尝试在我的数据库工具中执行您的查询,但似乎我无法声明此 @id ???我正在使用 DB2 工具。我收到错误 SQL 代码 104...-104 ILLEGAL SYMBOL "token"。一些可能合法的符号是:token-list ...是否可以在没有声明和函数的情况下进行计算?提前谢谢!!!!
  • 您能帮我解决这个问题吗?我不确定,但这个标志@似乎我不能在 SELECT 中使用
猜你喜欢
  • 1970-01-01
  • 2021-06-20
  • 2013-02-13
  • 1970-01-01
  • 1970-01-01
  • 2011-02-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多