Sql oracle группировка по условию - PullRequest
0 голосов
/ 26 марта 2020

У меня есть эти данные:

year code points
-------------
2017  M    1
2018  L    3
2019  L    5

Мне нужно общее количество баллов за 2019, взяв все коды до 2019, которые соответствуют коду 2019

, поэтому результат должен быть:

y     c  p
----------
2019  L  8

У меня есть база данных oracle, но я не уверен, как это сделать (с помощью 'connect by'?)

Чтобы легко проверить запрос:

WITH test AS (
SELECT 2017 y, 'M' code, 1 point FROM DUAL
UNION
SELECT 2018 y, 'L' code, 3 point FROM DUAL
UNION 
SELECT 2019 y, 'L' code, 5 point FROM DUAL
)
SELECT * FROM test

Ответы [ 2 ]

1 голос
/ 26 марта 2020

Вы можете сделать self join для достижения желаемого результата следующим образом:

SQL> WITH test AS (
  2  SELECT 2017 y, 'M' code, 1 point FROM DUAL
  3  UNION
  4  SELECT 2018 y, 'L' code, 3 point FROM DUAL
  5  UNION
  6  SELECT 2019 y, 'L' code, 5 point FROM DUAL
  7  )
  8  SELECT
  9      T1.Y,
 10      T1.POINT + COALESCE(T2.POINT,0) AS POINTS
 11  FROM
 12      TEST T1
 13      LEFT JOIN TEST T2 ON T1.CODE = T2.CODE
 14                           AND T1.Y > T2.Y
 15  WHERE T1.Y = '2019'
 16  ;

         Y     POINTS
---------- ----------
      2019          8

SQL>

Или вы можете использовать analytical function следующим образом:

SQL> WITH test AS (
  2  SELECT 2017 y, 'M' code, 1 point FROM DUAL
  3  UNION
  4  SELECT 2018 y, 'L' code, 3 point FROM DUAL
  5  UNION
  6  SELECT 2019 y, 'L' code, 5 point FROM DUAL
  7  )
  8  SELECT Y, POINTS FROM
  9  (SELECT
 10      T1.Y,
 11      SUM(T1.POINT) OVER (PARTITION BY CODE ORDER BY Y) AS POINTS
 12  FROM
 13      TEST T1)
 14  WHERE Y = '2019'
 15  ;

         Y     POINTS
---------- ----------
      2019          8

SQL>
0 голосов
/ 26 марта 2020

Я думаю, я бы go для:

select sum(points)
from (select code, sum(points) as points
      from t
      where y <= 2019
      group by code
      having max(y) = 2019
     ) x;

Это обрабатывает два крайних случая:

  • Это работает, если есть годы после 2019 года.
  • Работает, если для данного года в коде несколько строк.
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...