sql - 使用一个 SQL 查询进行分组和透视

标签 sql oracle date pivot

我无法弄清楚这一点,我已经尝试在互联网上查找了 3、4 个小时。 我正在尝试在 JAVA 项目中编写 SQL 查询,但我确实找不到适合我需求的解决方案。

这是我的(可能很长无用的)SQL 查询:

SELECT count(*), center, achiev_dat
FROM CONV_HC.CARE_PLANS
WHERE center = 961 AND ACHIEV_DAT >= '01/01/2018' AND ACHIEV_DAT <= '31/12/2018'
GROUP BY achiev_dat, center
UNION
SELECT count(*), center, achiev_dat
FROM CONV_HC.CARE_PLANS
WHERE center = 931 AND ACHIEV_DAT >= '01/01/2018' AND ACHIEV_DAT <= '31/12/2018'
GROUP BY achiev_dat, center
UNION
SELECT count(*), center, achiev_dat
FROM CONV_HC.CARE_PLANS
WHERE center = 923 AND ACHIEV_DAT >= '01/01/2018' AND ACHIEV_DAT <= '31/12/2018'
GROUP BY achiev_dat, center
UNION
SELECT count(*), center, achiev_dat
FROM CONV_HC.CARE_PLANS
WHERE center = 913 AND ACHIEV_DAT >= '01/01/2018' AND ACHIEV_DAT <= '31/12/2018'
GROUP BY achiev_dat, center
UNION
SELECT count(*), center, achiev_dat
FROM CONV_HC.CARE_PLANS
WHERE center = 902 AND ACHIEV_DAT >= '01/01/2018' AND ACHIEV_DAT <= '31/12/2018'
GROUP BY achiev_dat, center

这是输出:

[COUNT(*), CENTER, DATE]
[420, 931, 2018-04-30 00:00:00.0]
[421, 923, 2018-02-23 00:00:00.0]
[421, 961, 2018-05-06 00:00:00.0]
[422, 923, 2018-03-19 00:00:00.0]
[422, 923, 2018-03-20 00:00:00.0]
[422, 923, 2018-04-05 00:00:00.0]
[423, 961, 2018-04-22 00:00:00.0]
[424, 923, 2018-04-03 00:00:00.0]
... And so on...

但我正在寻找如下所示的结果:

[CENTER, JANUARY, FEBRUARY, MARCH, ...]
[961, january count, february count, march count, ...]
[931, january count, february count, march count, ...]
[923, january count, february count, march count, ...]
[902, january count, february count, march count, ...]
[913, january count, february count, march count, ...]
[ALL, january count, february count, march count, ...]

CENTER 参数有 5 个变量:902、913、923、931 和 961。 我相信我必须对月份进行透视,但我首先需要对它们进行分组,以便 2018-01-01 和 2018-01-31 之间的结果是一月,2018-02-01 和 2018-02-28 之间的结果分组在二月下, ... 我尝试过:

ORDER BY CASE WHEN achiev_dat BETWEEN TO_DATE('2018-01-01', 'YYYY-MM-DD')
AND TO_DATE('2018-05-31', 'YYYY-MM-DD') THEN 'January'

但它没有做任何事情。更不用说将其与 PIVOT 函数合并了。这超出了我的 SQL 知识范围。

非常感谢您的帮助!

最佳答案

SQL Fiddle

Oracle 11g R2 架构设置:

CREATE TABLE CONV_HC.care_plans ( center, achiev_dat ) AS
SELECT 961, DATE '2018-01-01' FROM DUAL UNION ALL
SELECT 961, DATE '2018-03-01' FROM DUAL UNION ALL
SELECT 931, DATE '2018-01-01' FROM DUAL;

查询 1:

SELECT COALESCE( TO_CHAR( Center ), 'ALL' ) AS center,
       January,
       February,
       March,
       April,
       May,
       June,
       July,
       August,
       September,
       October,
       November,
       December
FROM   (
  SELECT COUNT(*) AS cnt,
         center,
         EXTRACT( MONTH FROM achiev_dat ) AS month
  FROM   CONV_HC.CARE_PLANS
  WHERE  center IN ( 961, 931, 923, 913, 902 )
  AND    ACHIEV_DAT >= DATE '2018-01-01'
  AND    ACHIEV_DAT <  DATE '2019-01-01'
  GROUP BY ROLLUP( Center ),
           EXTRACT( MONTH FROM achiev_dat )
)
PIVOT ( MAX(cnt) FOR month IN (
   1 AS January,
   2 AS February,
   3 AS March,
   4 AS April,
   5 AS May,
   6 AS June,
   7 AS July,
   8 AS August,
   9 AS September,
  10 AS October,
  11 AS November,
  12 AS December
) )
ORDER BY center NULLS LAST

<强> Results :

| CENTER | JANUARY | FEBRUARY |  MARCH |  APRIL |    MAY |   JUNE |   JULY | AUGUST | SEPTEMBER | OCTOBER | NOVEMBER | DECEMBER |
|--------|---------|----------|--------|--------|--------|--------|--------|--------|-----------|---------|----------|----------|
|    931 |       1 |   (null) | (null) | (null) | (null) | (null) | (null) | (null) |    (null) |  (null) |   (null) |   (null) |
|    961 |       1 |   (null) |      1 | (null) | (null) | (null) | (null) | (null) |    (null) |  (null) |   (null) |   (null) |
|    ALL |       2 |   (null) |      1 | (null) | (null) | (null) | (null) | (null) |    (null) |  (null) |   (null) |   (null) |

关于sql - 使用一个 SQL 查询进行分组和透视,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50583668/

相关文章:

php - 在 Wordpress 博客之外查询 Wordpress 数据库以返回最新的博客链接、摘录

sql - 选择与列表中所有项目匹配的行组

mysql - Django 查询和存储过程(MySQL)之间的性能差异?

sql - 无法从存储过程(PL/SQL)中的dba_tab_cols中选择

javascript - 新的日期(日期).getTime();以 d/m/y 格式读取时间

javascript - 如果系统时钟错误,Javascript的Date().getTime()会不正确吗?

mysql - 如何在 SQL 中不使用 Unique/Primary key 关键字的情况下将数据唯一地插入到表中?还有其他办法吗?

oracle - 简单的 Oracle 存储过程

Oracle选择匹配连接条件的随机行

Python:查找从今天开始两个月开始的日期并从星期一开始