1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55
|
SQL> SELECT 'Resultat ----> '||substr(string,2) string
2 FROM (SELECT 'CHAMP'||POSITION LIBELLE ,CHAMP1||'-'||CHAMP2 CHAMP,CHAINE ,1 GRP
3 FROM (WITH TT AS
4 (SELECT CASE
5 WHEN CHAMP1 > CHAMP2
6 THEN CHAMP2
7 ELSE CHAMP1
8 END CHAMP1,
9 CASE
10 WHEN CHAMP2 > CHAMP1
11 THEN CHAMP2
12 ELSE CHAMP1
13 END CHAMP2
14 FROM TOTO
15 ORDER BY CHAMP1, CHAMP2)
16 SELECT CHAMP1, CHAMP2, LEAD (CHAMP1, 1) OVER (ORDER BY CHAMP1 ASC) NEXT
17 FROM TT
18 UNION
19 SELECT *
20 FROM (SELECT CHAMP2, LEAD (CHAMP1, 1) OVER (ORDER BY CHAMP1 ASC) NEXT, '-1'
21 FROM TT)
22 WHERE NEXT != CHAMP2 )
23 MODEL
24 RETURN UPDATED ROWS
25 DIMENSION BY ( ROWNUM POSITION )
26 MEASURES ( CAST( CHAMP1||CHAMP2 AS VARCHAR2(4000) ) AS CHAINE , CHAMP1,CHAMP2,NEXT, 0 FLAG_ANOM
ALIE )IGNORE NAV
27 RULES
28 UPSERT
29 (
30 CHAINE[POSITION>=1] =CASE WHEN NEXT[CV()]!='-1' OR NEXT[CV()] IS NULL THEN
31 CHAMP1[CV()]||'-'||CHAMP2[CV()]
32 WHEN NEXT[CV()]='-1' THEN
33 'Anomalie' END
34 )
35 )
36 MODEL
37 RETURN UPDATED ROWS
38 partition by ( grp)
39 DIMENSION BY ( row_number() over(partition by grp order by champ)POSITION )
40 MEASURES ( libelle,champ, CAST( chaine AS VARCHAR2(3000) ) AS string )IGNORE NAV
41 RULES
42 UPSERT
43 ITERATE( 1000)
44 UNTIL ( PRESENTV(string[ITERATION_NUMBER+2],1,0) = 0)
45 ( string[0] =string[0] || ',' || string[ ITERATION_NUMBER+1] )
46 ORDER BY 1
47 /
STRING
----------------------------------------------------------------------------------------------------
Resultat ----> A-B,B-C,C-D,Anomalie,E-F,F-G,G-H
SQL> |