将 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
我有一个问题:
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
:
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