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"