oracle按月份获取每个季度的数据

Get each quarter data based on month in oracle

我的 table :

   Year  Month   Value1    Value2
   2020   1       100       100
   2020   2       100       100
   2020   3       100       100
   2020   4       100       100
   2020   5       100       100
   2020   6       100       100
   2020   7       100       100
   2020   8       100       100
   2020   9       100       100
   2020   10      100       100
   2020   11      100       100
   2020   12      100       100

我的输出应该是什么样子:

   Year  Quarter   Value1    Value2
   2020   Q1        300       300
   2020   Q2        300       300
   2020   Q3        300       300
   2020   Q4        300       300

我尝试了什么:

select year,sum(value1),sum(value2),sum(value3) 
  from table 
 where month=1 or month=2 or month=3 
 group by year;

但我只得到第一季度...如何编写 sql 查询

提前致谢...!!!

这里使用条件聚合。我们可以先在 CTE 中生成季度列,然后按年和季度汇总以获得总和。

WITH cte AS (
    SELECT
        Year, Value1, Value2,
        CASE WHEN Month BETWEEN 1 AND 3 THEN 'Q1'
             WHEN Month BETWEEN 4 AND 6 THEN 'Q2'
             WHEN Month BETWEEN 7 AND 9 THEN 'Q3'
             ELSE 'Q4' END AS Quarter
    FROM yourTable
)

SELECT
    Year,
    Quarter,
    SUM(Value1) AS Value1,
    SUM(Value2) AS Value2
FROM cte
GROUP BY
    Year,
    Quarter
ORDER BY
    Year,
    Quarter;

您可以通过将月份除以 3 并向上舍入来计算季度:

SELECT Year,
       'Q' || CEIL( month / 3 ) AS Quarter,
       SUM( Value1 ) AS Value1,
       SUM( Value2 ) AS Value2
FROM   table_name
GROUP BY
       Year,
       CEIL( month / 3 )
ORDER BY
       Year,
       Quarter;

其中,对于示例数据:

CREATE TABLE table_name ( Year, Month, Value1, Value2 ) AS
SELECT 2020,  1, 100, 100 FROM DUAL UNION ALL
SELECT 2020,  2, 100, 100 FROM DUAL UNION ALL
SELECT 2020,  3, 100, 100 FROM DUAL UNION ALL
SELECT 2020,  4, 100, 100 FROM DUAL UNION ALL
SELECT 2020,  5, 100, 100 FROM DUAL UNION ALL
SELECT 2020,  6, 100, 100 FROM DUAL UNION ALL
SELECT 2020,  7, 100, 100 FROM DUAL UNION ALL
SELECT 2020,  8, 100, 100 FROM DUAL UNION ALL
SELECT 2020,  9, 100, 100 FROM DUAL UNION ALL
SELECT 2020, 10, 100, 100 FROM DUAL UNION ALL
SELECT 2020, 11, 100, 100 FROM DUAL UNION ALL
SELECT 2020, 12, 100, 100 FROM DUAL;

输出:

YEAR | QUARTER | VALUE1 | VALUE2
---: | :------ | -----: | -----:
2020 | Q1      |    300 |    300
2020 | Q2      |    300 |    300
2020 | Q3      |    300 |    300
2020 | Q4      |    300 |    300

db<>fiddle here