如何根据 Teradata 中的条件对多行数据求和?

How to sum data from multiple rows, based on a condition in Teradata?

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

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)

但它 returns 值是累积的。如何正确操作?

你可以做一个小组

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 一起使用的 window 函数将累加所有前面的 Money 值,因此得到之前的结果

你可以做一个window求和,但是你需要删除rows子句:因为你指定了rows unbounded preceding,查询只考虑前面的行,而你想对整个分区求和:

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

旁注:指定 preceding 行而没有排序依据并没有真正意义 - 使用此语法,您会得到一组 undefined 正在考虑的行划分。

您似乎想要 CountrySystem 组合的总和。 window 函数是要走的路,但是 partition by 而不是 order by:

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

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

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

这将为您提供基于组的 SUM,还有 return 所有详细的行数据。

您可以根据自己的目的使用 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