将 4 行后的所有行分组并创建第 5 行分组行

Group all rows after 4 rows and create 5th row of grouped rows

我有一个问题:

SELECT *
FROM   (
  SELECT WORKING_DAYS, ACTIVITY
  FROM TABLE
)
PIVOT (
  COUNT(ACTIVITY)
  FOR ACTIVITY IN (
     6 AS NL6,
     7 AS NL7,
     8 AS NL8,
     9 AS NL9,
    11 AS NL11
  )
)
ORDER BY WORKING_DAYS;

上述查询的输出如下:

我试图得到如下输出,但我不知道如何继续:

谁能帮忙告诉我最好的解决方案?

我使用的是 Oracle 版本 - 12.1.0.2

条件聚合更容易完成:

select 
    case when working_days > 4 then '> 4' else to_char(working_days) end as working_days,
    sum(case when activity =  6 then 1 else 0 end) nls6,
    sum(case when activity =  7 then 1 else 0 end) nls7,
    sum(case when activity =  8 then 1 else 0 end) nls8,
    sum(case when activity =  9 then 1 else 0 end) nls9
    sum(case when activity = 11 then 1 else 0 end) nls11
from mytable
group by case when working_days > 4 then '> 4' else to_char(working_days) end

您可以在 PIVOT:

之前的 sub-query 中将 WORKING DAYS 转换为您想要的格式
SELECT *
FROM   (
  SELECT CASE
         WHEN WORKING_DAYS <= 4
         THEN TO_CHAR( WORKING_DAYS )
         ELSE '>4'
         END AS working_days,
         ACTIVITY
  FROM   table_name
)
PIVOT (
  COUNT(ACTIVITY)
  FOR ACTIVITY IN (
     6 AS NL6,
     7 AS NL7,
     8 AS NL8,
     9 AS NL9,
    11 AS NL11
  )
)
ORDER BY WORKING_DAYS;

其中,对于您的示例数据:

CREATE TABLE table_name ( working_days, activity ) AS
SELECT  1, 6 FROM DUAL CONNECT BY LEVEL <= 2 UNION ALL
SELECT  3, 6 FROM DUAL CONNECT BY LEVEL <= 1 UNION ALL
SELECT  4, 9 FROM DUAL CONNECT BY LEVEL <= 2 UNION ALL
SELECT  7, 6 FROM DUAL CONNECT BY LEVEL <= 7 UNION ALL
SELECT  8, 6 FROM DUAL CONNECT BY LEVEL <= 3 UNION ALL
SELECT  8, 8 FROM DUAL CONNECT BY LEVEL <= 1 UNION ALL
SELECT  9, 6 FROM DUAL CONNECT BY LEVEL <= 2 UNION ALL
SELECT 11, 8 FROM DUAL CONNECT BY LEVEL <= 1 UNION ALL
SELECT 12, 6 FROM DUAL CONNECT BY LEVEL <= 1 UNION ALL
SELECT 13, 6 FROM DUAL CONNECT BY LEVEL <= 3 UNION ALL
SELECT 13, 8 FROM DUAL CONNECT BY LEVEL <= 2 UNION ALL
SELECT 14, 9 FROM DUAL CONNECT BY LEVEL <= 1 UNION ALL
SELECT 16, 8 FROM DUAL CONNECT BY LEVEL <= 1 UNION ALL
SELECT 18, 8 FROM DUAL CONNECT BY LEVEL <= 1 UNION ALL
SELECT 24, 9 FROM DUAL CONNECT BY LEVEL <= 1 UNION ALL
SELECT 25, 7 FROM DUAL CONNECT BY LEVEL <= 1;

输出:

WORKING_DAYS | NL6 | NL7 | NL8 | NL9 | NL11
:----------- | --: | --: | --: | --: | ---:
1            |   2 |   0 |   0 |   0 |    0
3            |   1 |   0 |   0 |   0 |    0
4            |   0 |   0 |   0 |   2 |    0
>4           |  16 |   1 |   6 |   2 |    0

db<>fiddle here