Как суммировать данные из нескольких строк, основываясь на условии в Teradata? - PullRequest
0 голосов
/ 18 февраля 2020

Я пытаюсь суммировать данные, основанные на двух столбцах, где значения в 2 рядах равны. Вот моя таблица:

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)

, но возвращает значения кумулятивно. Как это сделать правильно?

Ответы [ 5 ]

3 голосов
/ 18 февраля 2020

Вы можете сделать сумму окна, но вам нужно удалить предложение rows: поскольку вы указали rows unbounded preceding, запрос учитывает только предыдущие строки, а вы хотите суммировать по всему разделу:

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

Примечание: указание preceding строк без порядка на самом деле не имеет смысла - с этим синтаксисом вы получаете неопределенный набор строк, рассматриваемых в разделе.

1 голос
/ 18 февраля 2020

Похоже, вы просто группируете по (country, system). Попробуйте:

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

Это даст вам SUM на основе групп, но также вернет все подробные данные строки.

1 голос
/ 18 февраля 2020

Вы, кажется, хотите получить сумму, превышающую комбинацию Country и System. Оконная функция - это путь к go, но с partition by, а не order by:

SELECT t.*,
       SUM(Money) OVER (PARTITION BY Country, System)
FROM t;
1 голос
/ 18 февраля 2020

Вы можете создать группу

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, следовательно, результат, который вы имели до

0 голосов
/ 18 февраля 2020

Вы можете использовать над разделом по предложению для ваших целей.

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
...