0
votes

Comment aplanifier l'onglet de la clé de clé de clé de valeur de la paire de texte de texte du texte dans une table où la clé est la colonne et la valeur est des données pour la cellule

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;


0 commentaires

3 Réponses :


1
votes

Quelque chose comme ça pourrait fonctionner: xxx

plomb (x, n) sur (commande par ) signifie renvoyer la valeur de la colonne " X "qui est" n "Nombre de lignes en avance sur la ligne actuelle avec les lignes commandées par


0 commentaires

0
votes

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


0 commentaires

0
votes

Si je vous comprends correctement, vous avez deux problèmes:

  1. regrouper les paires de valeur par "enregistrement" .. li>
  2. pivotant les rangées aux colonnes li> ol>

    J'ai créé un SQL Fiddle avec une table comme celle-ci, et j'ai ajouté vos données d'échantillon. p> xxx pré>

    pour le premier problème, j'ai supposé que 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>

    pour la deuxième partie, j'ai simplement utilisé l'oracle pivot code > Opérateur pour pivoter les lignes dans des colonnes. p> xxx pré>

    Vous obtiendrez la sortie suivante: 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"
    


0 commentaires