【问题标题】:How to sum data from multiple rows, based on a condition in Teradata?如何根据 Teradata 中的条件汇总多行数据?
【发布时间】:2020-02-18 14:45:45
【问题描述】:

我正在尝试根据两列对数据求和,其中两行中的值相等。 这是我的桌子:

Country   | System     | Money
 AAA      | A          | 10
 AAA      | A          | 200
 AAA      | B          | 60
 BBB      | B          | 600
 BBB      | A          | 150
 BBB      | B          | 140

这就是我想要实现的目标:

Country   | System     | Money  | SystemSum
 AAA      | A          | 10     |  210
 AAA      | A          | 200    |  210
 AAA      | B          | 60     |  60
 BBB      | B          | 600    |  740
 BBB      | A          | 150    |  150
 BBB      | B          | 140    |  740

这是我尝试过的:

SUM(Money) OVER (ORDER BY Country, System ROWS UNBOUNDED PRECEDING)

但它会累积返回值。如何正确操作?

【问题讨论】:

    标签: sql teradata window-functions cumulative-sum


    【解决方案1】:

    您可以进行窗口求和,但您需要删除rows 子句:由于您指定了rows unbounded preceding,因此查询只考虑前面的行,而您想要对整个分区求和:

    select 
        t.*, 
        sum(money) over(partition by country, system) systemsum
    from mytable as t
    

    旁注:指定preceding 行而不按顺序实际上没有意义 - 使用此语法,您会得到一个 undefined 正在考虑分区内的行集。

    【讨论】:

      【解决方案2】:

      您似乎想要CountrySystem 的组合的总和。窗口函数是可行的方法,但使用partition by 而不是order by

      SELECT t.*,
             SUM(Money) OVER (PARTITION BY Country, System)
      FROM t;
      

      【讨论】:

      • 感谢您的回答,确实 OVER(PARTITION BY ...) 有效。
      【解决方案3】:

      您似乎只是按(country, system) 分组。试试这个:

      SELECT 
        Country, System, Money, 
        SUM(Money) OVER(PARTITION BY Country, System) AS SystemSum
      FROM MyTable
      

      这将根据组为您提供SUM,同时返回所有详细的行数据。

      【讨论】:

      • 感谢您的回答,确实 OVER(PARTITION BY ...) 有效。
      【解决方案4】:

      可以组团

      select a.Country, a.System, a.Money, SystemSum
      from tbl a inner join
      (
          select Country, System,
          SUM(Money) as SystemSum
          from tbl
          group by Country, System
      ) b on a.Country = b.Country and a.System = b.System
      

      与 ROWS UNBOUNDED PRECEDING 一起使用的窗口函数将累积所有前面的 Money 值,因此是您之前的结果

      【讨论】:

      • 似乎 OP 想要保留 Money 列。
      【解决方案5】:

      您可以根据自己的目的使用 over partition by 子句。

      WITH TBL(COUNTRY,SYSTEM,MONEY) AS (
       SELECT 'AAA' AS COUNTRY,'A' AS SYSTEM ,10  AS MONEY FROM DUAL UNION ALL
      SELECT 'AAA' AS COUNTRY,'A' AS SYSTEM ,200 AS MONEY FROM DUAL UNION ALL
      SELECT 'AAA' AS COUNTRY,'B' AS SYSTEM ,60  AS MONEY FROM DUAL UNION ALL
      SELECT 'BBB' AS COUNTRY,'B' AS SYSTEM ,600 AS MONEY FROM DUAL UNION ALL
      SELECT 'BBB' AS COUNTRY,'A' AS SYSTEM ,150 AS MONEY FROM DUAL UNION ALL
      SELECT 'BBB' AS COUNTRY,'B' AS SYSTEM ,140 AS MONEY FROM DUAL )
      SELECT COUNTRY,SYSTEM,MONEY,SUM(MONEY)OVER(PARTITION BY COUNTRY,SYSTEM) AS SUMALL FROM TBL
      

      【讨论】:

        猜你喜欢
        • 2021-07-20
        • 1970-01-01
        • 2019-03-06
        • 2021-06-28
        • 2019-06-12
        • 1970-01-01
        • 1970-01-01
        • 2017-12-06
        • 1970-01-01
        相关资源
        最近更新 更多