【问题标题】:Running calculation in SQL query在 SQL 查询中运行计算
【发布时间】:2021-12-23 16:08:52
【问题描述】:

我有一个包含数字列表的表格:

select SERIAL, CHANGE from TABLE

我得到这个结果:

1    35
2    10
3    -3
4     2
5     9

现在我想做一个累计,从另一个查询得到的数字开始,比如:

select NUMBER from NUMBERLIST

说 NUMBER 是 44。我想构造一个查询,给我:

0     0    44
1    35    79
2    10    89
3    -3    86
4     2    88
5     9    97

这在 SQL 中可行吗?

【问题讨论】:

    标签: sql db2


    【解决方案1】:

    是的,这是可行的,但我不太确定你想看到的结果。

    例如:

    SELECT COLUMN1, (COLUMN1 + 44) as 'COLUMN2' FROM NUMBERLIST
    

    应该给你两列结果。第一个包含原始数据。第二个包含原始数据 + 44,我们也将其命名为“COLUMN2”。

    如果您只想查看数据 + 44,那么:

    SELECT (COLUMN1 + 44) as 'COLUMN NAME' FROM NUMBERLIST
    

    我刚刚意识到您想从另一个查询中添加一个数字。在这种情况下,您将需要一个嵌套选择。例如:

    SELECT (SELECT NUMBER FROM TABLE) as 'COLUMN1', ((SELECT NUMBER FROM TABLE) + 44) AS 'COLUMN2'
    

    【讨论】:

      【解决方案2】:

      试试这个:

      SELECT 
        SERIAL
      , DECODE (SERIAL, 0, 0, CHANGE) AS CHANGE
      , SUM (CHANGE) OVER (ORDER BY SERIAL) AS CHANGE_TOTAL
      FROM
      (
        SELECT SERIAL, CHANGE
        FROM 
        /*
        (
        VALUES
          (1, 35)
        , (2, 10)
        , (3, -3)
        , (4,  2)
        , (5,  9)
        ) 
        */
        TABLE --(SERIAL, CHANGE)
        
          UNION ALL
      
        SELECT 0 AS SERIAL, NUMBER AS CHANGE 
        FROM 
        --(VALUES 44) 
        NUMBERLIST 
        --(NUMBER)
      )
      

      如果您取消注释掉注释掉的行,您可以按原样运行该语句并得到以下结果:

      SERIAL CHANGE CHANGE_TOTAL
      0 0 44
      1 35 79
      2 10 89
      3 -3 86
      4 2 88
      5 9 97

      【讨论】:

        【解决方案3】:

        您可以通过将两个查询合并在一起,然后使用函数 sum() over() 进行累积求和来做到这一点:

        select id , val , SUM(val) over( order by id) As SumVal from (
        select 0 As id , number As val from NUMBERLIST
        union 
        select id , val from Table_1 ) T
        

        第一个函数或查询必须只返回一行。

        结果

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2021-10-23
          • 2017-06-11
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多