您可以将UNPIVOT 与列对一起使用,然后对Yes 行进行过滤并使用ROW_NUMBER 分析函数来获取结果的增量索引:
查询:
SELECT id,
ROW_NUMBER() OVER ( PARTITION BY id ORDER BY value ) AS "COUNT",
name
FROM table_name
UNPIVOT ( ( cond, name ) FOR value IN (
( Cond1, Name1 ) AS 'V1',
( Cond2, Name2 ) AS 'V2',
( Cond3, Name3 ) AS 'V3',
( Cond4, Name4 ) AS 'V4',
( Cond5, Name5 ) AS 'V5'
) )
WHERE cond = 'Yes'
测试数据:
CREATE TABLE table_name (
ID NUMBER(10,0) PRIMARY KEY,
Cond1 VARCHAR2(3) CHECK ( Cond1 IN ( 'Yes', 'No' ) ),
Cond2 VARCHAR2(3) CHECK ( Cond2 IN ( 'Yes', 'No' ) ),
Cond3 VARCHAR2(3) CHECK ( Cond3 IN ( 'Yes', 'No' ) ),
Cond4 VARCHAR2(3) CHECK ( Cond4 IN ( 'Yes', 'No' ) ),
Cond5 VARCHAR2(3) CHECK ( Cond5 IN ( 'Yes', 'No' ) ),
Name1 VARCHAR2(10),
Name2 VARCHAR2(10),
Name3 VARCHAR2(10),
Name4 VARCHAR2(10),
Name5 VARCHAR2(10),
CHECK ( ( Cond1 = 'Yes' AND Name1 IS NOT NULL ) OR ( Cond1 = 'No' AND ( Name1 IS NULL OR Name1 = 'n/a' ) ) ),
CHECK ( ( Cond2 = 'Yes' AND Name2 IS NOT NULL ) OR ( Cond2 = 'No' AND ( Name2 IS NULL OR Name2 = 'n/a' ) ) ),
CHECK ( ( Cond3 = 'Yes' AND Name3 IS NOT NULL ) OR ( Cond3 = 'No' AND ( Name3 IS NULL OR Name3 = 'n/a' ) ) ),
CHECK ( ( Cond4 = 'Yes' AND Name4 IS NOT NULL ) OR ( Cond4 = 'No' AND ( Name4 IS NULL OR Name4 = 'n/a' ) ) ),
CHECK ( ( Cond5 = 'Yes' AND Name5 IS NOT NULL ) OR ( Cond5 = 'No' AND ( Name5 IS NULL OR Name5 = 'n/a' ) ) )
);
INSERT INTO table_name ( ID, Cond1, Cond2, Cond3, Cond4, Cond5, Name1, Name2, Name3, Name4, Name5 )
SELECT 1, 'No', 'Yes', 'No', 'No', 'Yes', null, 'Result1', 'n/a', null, 'Result2' FROM DUAL UNION ALL
SELECT 2, 'Yes', 'No', 'Yes', 'No', 'Yes', 'Result3', 'n/a', 'Result4', null, 'Result5' FROM DUAL;
输出:
身份证 |计数 |姓名
-: | ----: | :------
1 | 1 |结果1
1 | 2 |结果2
2 | 1 |结果3
2 | 2 |结果4
2 | 3 |结果5
db小提琴here