我想按国家/地区对下表进行分组,如果国家/地区为空,那么我想按州分组。有没有办法在纯SQL中做?如果状态没有条件,我可以分组!
+--------+-------+---------+
| EMP ID | STATE | COUNTRY |
+--------+-------+---------+
| 1 | AP | IN |
| 2 | UP | IN |
| 3 | MP | IN |
| 4 | NJ | US |
| 5 | NY | US |
| 6 | CA | US |
| 7 | PA | |
| 8 | PA | |
| 9 | CR | |
+--------+-------+---------+
预期输出:
+--------+-----------+---------+
| EMP ID | STATE | COUNTRY |
+--------+-----------+---------+
| 1,2,3 | AP,UP, MP | IN |
| 4,5,6 | NJ,NY,CA | US |
| 7,8 | PA,PA | |
| 9 | CR | |
+--------+-----------+---------+
答案 0 :(得分:0)
这样做:
WITH d AS (
SELECT 1 id, 'AP' state, 'IN' country FROM DUAL UNION ALL
SELECT 2 id, 'UP' state, 'IN' country FROM DUAL UNION ALL
SELECT 3 id, 'MP' state, 'IN' country FROM DUAL UNION ALL
SELECT 4 id, 'NJ' state, 'US' country FROM DUAL UNION ALL
SELECT 5 id, 'NY' state, 'US' country FROM DUAL UNION ALL
SELECT 6 id, 'CA' state, 'US' country FROM DUAL UNION ALL
SELECT 7 id, 'PA' state, null country FROM DUAL UNION ALL
SELECT 8 id, 'PA' state, null country FROM DUAL UNION ALL
SELECT 9 id, 'CR' state, null country FROM DUAL)
SELECT listagg(id,',') within group ( order by id),
listagg(state,',') within group (order by state),
country
FROM d
group by nvl(country, state), country
order by 1
答案 1 :(得分:0)
在SELECT中使用case语句:
SELECT EMP_ID, STATE, CASE WHEN COUNTRY IS NULL THEN STATE ELSE COUNTRY END AS COUNTRY_STATE
FROM [TABLE]
然后您可以使用LISTAGG()汇总值,具体取决于您的Oracle版本
SELECT LISTAGG(EMP_ID, ',') WITHIN GROUP,
LISTAGG(STATE, ',') WITHIN GROUP,
COUNTRY_STATE
FROM (
SELECT EMP_ID, STATE, CASE WHEN COUNTRY IS NULL THEN STATE ELSE COUNTRY END AS COUNTRY_STATE
FROM [TABLE] )
GROUP BY COUNTRY_STATE