使用一个SQL查询分组和透视

使用一个SQL查询分组和透视,sql,oracle,date,pivot,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

我想不出这一点,我已经在互联网上搜索了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
但我在寻找这样一个结果:

[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, ...]
中心参数有5个变量:902、913、923、931和961。 我认为我必须重点关注月份,但我首先需要对月份进行分组,以便2018-01-01和2018-01-31之间的结果为1月份,2018-02-01和2018-02-28之间的结果为2月份。。。 我试过:

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知识范围


非常感谢你的帮助

您可以使用条件聚合执行此操作:

SELECT COALESCE(TO_CHAR(center), 'Total') as center,
       SUM(CASE WHEN TO_CHAR(ACHIEV_DAT, 'MM') = '01' THEN 1 ELSE 0 END) as jan,
       SUM(CASE WHEN TO_CHAR(ACHIEV_DAT, 'MM') = '02' THEN 1 ELSE 0 END) as feb,
       . . .
FROM CONV_HC.CARE_PLANS
WHERE center IN (961, 931, . . . ) AND
      ACHIEV_DAT >= '2018-01-01' AND 
      ACHIEV_DAT <= '2018-12-31'
GROUP BY ROLLUP(center)
选择合并(至字符(中心),“总计”)作为中心,
求和(以1月为单位,以字符(Achive_DAT,'MM')='01'然后1或0结束时为例),
求和(当到字符(Achive_DAT,'MM')='02'然后1,否则0结束时的情况)为2月,
. . .
来自CONV_HC.护理计划
其中中心位于(961931,…)和
Achide_DAT>=“2018-01-01”和
达成一致

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;
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
| 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) |
查询1

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;
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
| 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) |

谢谢你的帮助。我无法摆脱ORA-01861:文本与格式字符串不匹配。我尝试用TO_DATE替换TO_CHAR,但结果相同。知道吗?Achive_DAT的数据类型是什么?