J'ai un fichier texte où une ligne unique est divisée dans plusieurs rangées dans une paire de forces de clé. Les données ressemblent ci-dessous:
1 800001348 P>
2, option idéale p>
27, lieu de service p>
39, option idéale p>
400,123 rue principale p>
400, STE G P>
410, Seattle P>
420, Washington P>
423, Benton P> >
430,99336 p>
et l'ensemble du bloc répète à nouveau: 1 850000900 P>
2, Invitae Corporation P>
27, lieu de service P>
39, Invitae Corporation P>
400, avenue XYZ 1ST
410, San Francisco P>
420, Californie P>
423, San Francisco P>
430 94103 P>
J'ai Chargé ce fichier dans Oracle à l'aide de SQL Loader. L'intégrité est maintenue car j'ai un numéro de séquence attaché à toutes les lignes afin que je puisse traverser la rangée de table à la ligne et indiquer où la 1ère ligne commence et se termine. P>
Valeur de clé SEQNUM P>
1 800001348 1 P>
2 Option idéale 2 P>
27 Lieu de service 3 P>
39 Option idéale 4 P>
400 123 Main Street 5
400 STE G 6 P>
410 Kennewick 7 P>
420 Washington 8 P>
423 Benton 9 P>
430 99336 10 P>
1 850000900 11 P>
2 Invitae Corporation 12 P>
27 Lieu de service 13 P>
39 Invitae Corporation 14 P>
400 XYZ 1ST AVENUE 15 P>
410 SAN FRANCISCO 16 P>
420 CALIFORNIE 17 P>
423 SAN FRANCISCO 18 P>
430 94103 19 P>
select case when KEY = '1' then value else null end as FACILITY_ID, case when KEY = '2' then value else null end as Unknown_num, case when KEY = '27' then value else null end as TYPE_OF_LOCATION, case when KEY = '39' then value else null end as EXTERNAL_NAME, case when KEY = '400' then value else null end as ADDRESS, case when KEY = '410' then value else null end as CITY, case when KEY = '420' then value else null end as STATE, case when KEY = '423' then value else null end as COUNTY, case when KEY = '430' then value else null end as ZIP_CODE, value, SEQNUM from MDM_ODS.EAF_EPIC_IMPORT order by SEQNUM;
3 Réponses :
Quelque chose comme ça pourrait fonctionner: plomb (x, n) sur (commande par
Essayez le code suivant:
-- MANUAL DATA CREATION WITH DATAA AS ( SELECT 1 KEY, '800001348' VALUE, 1 SEQNUM FROM DUAL UNION ALL SELECT 2, 'IDEAL OPTION', 2 FROM DUAL UNION ALL SELECT 27, 'Place of Service', 3 FROM DUAL UNION ALL SELECT 39, 'IDEAL OPTION', 4 FROM DUAL UNION ALL SELECT 400, '123 MAIN STREET', 5 FROM DUAL UNION ALL SELECT 400, 'Ste G', 6 FROM DUAL UNION ALL SELECT 410, 'SEATTLE', 7 FROM DUAL UNION ALL SELECT 420, 'Washington', 8 FROM DUAL UNION ALL SELECT 423, 'BENTON', 9 FROM DUAL UNION ALL SELECT 430, '99336', 10 FROM DUAL -- -- UNION ALL -- -- SELECT 1 KEY, '850000900' VALUE, 11 SEQNUM FROM DUAL UNION ALL SELECT 2, 'INVITAE CORPORATION', 12 FROM DUAL UNION ALL SELECT 27, 'Place of Service', 13 FROM DUAL UNION ALL SELECT 39, 'INVITAE CORPORATION', 14 FROM DUAL UNION ALL SELECT 400, 'XYZ 1st AVENUE', 15 FROM DUAL UNION ALL SELECT 410, 'SAN FRANCISCO', 16 FROM DUAL UNION ALL SELECT 420, 'California', 17 FROM DUAL UNION ALL SELECT 423, 'SAN FRANCISCO', 18 FROM DUAL UNION ALL SELECT 430, '94103', 19 FROM DUAL ) -- -- YOUR QUERY STARTS FROM HERE -- SELECT MAX(CASE WHEN KEY = '1' THEN VALUE END) AS FACILITY_ID, MAX(CASE WHEN KEY = '2' THEN VALUE END) AS UNKNOWN_NUM, MAX(CASE WHEN KEY = '27' THEN VALUE END) AS TYPE_OF_LOCATION, MAX(CASE WHEN KEY = '39' THEN VALUE END) AS EXTERNAL_NAME, TRIM(',' FROM LISTAGG(CASE WHEN KEY = '400' THEN VALUE END, ',') WITHIN GROUP( ORDER BY SEQNUM ) ) AS ADDRESS, -- ADDRESS HAS MORE THAN ONE RECORD IN THE FIRST GROUP OF VALUES MAX(CASE WHEN KEY = '410' THEN VALUE END) AS CITY, MAX(CASE WHEN KEY = '420' THEN VALUE END) AS STATE, MAX(CASE WHEN KEY = '423' THEN VALUE END) AS COUNTY, MAX(CASE WHEN KEY = '430' THEN VALUE END) AS ZIP_CODE FROM ( SELECT DATAA_ALL.KEY, DATAA_ALL.VALUE, DATAA_ALL.SEQNUM, COUNT(1) AS GRP_VAR FROM DATAA DATAA_ALL JOIN DATAA DATAA_FIRST ON ( DATAA_FIRST.KEY = 1 AND DATAA_ALL.SEQNUM >= DATAA_FIRST.SEQNUM ) GROUP BY DATAA_ALL.KEY, DATAA_ALL.VALUE, DATAA_ALL.SEQNUM ) GROUP BY GRP_VAR
Si je vous comprends correctement, vous avez deux problèmes:
J'ai créé un SQL Fiddle avec une table comme celle-ci, et j'ai ajouté vos données d'échantillon. p> pour le premier problème, j'ai supposé que pour la deuxième partie, j'ai simplement utilisé l'oracle Vous obtiendrez la sortie suivante: p> clé = 1 code> est votre identifiant d'enregistrement. L'objectif est donc d'attribuer cet ID à chaque paire de valeur qui appartient à cet enregistrement. Pour cela, j'ai utilisé une expression de coalesce qui copiera la valeur de la clé = 1 sur chaque paire de valeur. P>
pivot code > Opérateur pour pivoter les lignes dans des colonnes. p>
ID FACILITY_ID UNKNOWN_NUM TYPE_OF_LOCATION EXTERNAL_NAME ADDRESS CITY STATE COUNTY ZIP_CODE
"800001348" "800001348" "IDEAL OPTION" "Place of Service" "IDEAL OPTION" "Ste G" "KENNEWICK" "Washington" "BENTON" "99336"
"850000900" "850000900" "INVITAE CORPORATION" "Place of Service" "INVITAE CORPORATION" "XYZ 1st AVENUE" "SAN FRANCISCO" "California" "SAN FRANCISCO" "94103"