[英]Sql oracle group by and condition
我有這些數據:
year code points
-------------
2017 M 1
2018 L 3
2019 L 5
我需要2019年的總分,取2019年之前與2019年代碼匹配的所有代碼
所以結果應該是:
y c p
----------
2019 L 8
我有一個 oracle 數據庫,不知道該怎么做(使用“連接方式”?)
輕松測試請求:
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
您可以按如下方式進行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>
我想我會去:
select sum(points)
from (select code, sum(points) as points
from t
where y <= 2019
group by code
having max(y) = 2019
) x;
這處理兩種邊緣情況:
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.