[SQL] Convertie van Verticale structuur naar een Horizontale

Pagina: 1
Acties:

  • WesleyVH
  • Registratie: Mei 2004
  • Laatst online: 17-10-2023
Wij zijn op zoek naar een dynamishe manier de Source tabel om te zetten naar de Destination tabel. Het doet eigenlijk niet meer dan het aantal Subjects met Status * optellen voor elke Visit en dit in een kolom plaatsen met de naam 'Count_(Visit)'

Situatie:
======

Source table:
-------------------
SiteID SubjID Visit Status
1 1 W1 A
1 1 W2 B
1 1 W2 C
1 2 W1 C
1 2 W2 A
1 2 W3 A
1 3 W1 A
1 3 W2 C
...
2

Destination table:
------------------
SiteID Status Count_W1 Count_W2 Count_W3
1 A 2 1 1
1 B 0 1 0
1 C 1 1 1
...


Onze oplossing (Niet erg dynamisch en vooral heel lang)
===========

--> Eerst maken we een tijdelijke tabel waar we de enkel de eerste Visit selecteren.

CREATE TABLE Temp_W1
AS
SELECT SiteID, SubjID, Visit, Status Status_W1
FROM Source
WHERE Visit = 'W1';


--> Dan tellen we alles op van die Visit.

CREATE TABLE Temp_W1_Count
AS
SELECT SiteID,
'A' Status
Count(Status_W1) Count_W1
FROM Temp_W1
WHERE Status_W1 = 'A'
GROUP BY SiteID
UNION
SELECT SiteID,
'B' Status
Count(Status_W1) Count_W1
FROM Temp_W1
WHERE Status_W1 = 'B'
GROUP BY SiteID
UNION
SELECT SiteID,
'C' Status
Count(Status_W1) Count_W1
FROM Temp_W1
WHERE Status_W1 = 'C'
GROUP BY SiteID

--> Deze 2 stappen doen we voor elke Visit
--> (Met gevolg dat als er een Visit bijkomt we het script weer moeten aanpassen)

--> Als laatse stap Joinen we elke Temp_**_Count tabel

CREATE TABLE Destination
AS
SELECT SiteID, Status, Count_W1, Count_W2, Count_W3 ...


Vraag
========

Is er een manier om dit te bekomen op een kortere en dynamische manier?

  • WesleyVH
  • Registratie: Mei 2004
  • Laatst online: 17-10-2023
PS: We gebruiken Oracle

  • T-MOB
  • Registratie: Maart 2001
  • Laatst online: 18:16
Ik heb je openingspost nu al 5 keer gelezen en ik vat het nut nog steeds niet helemaal. Als het om een eenmalige conversie gaat dan is de lange procedure allicht vervelend, maar niet onoverkomelijk. Ga je dit vaker doen dan creëer je een database vol redundante data met bijbehorende problemen qua consistentie. Mijn beste gok is dat je verschillende databases hebt met een vergelijkbare lay-out waarvoor je de omzetting moet realiseren.

In dat geval dan zou ik iig niet proberen om het volledig in SQL te doen. Met een eenvoudig script in een willekeurige taal die met je database kan praten kun je met een aantal eenvoudige queries dynamisch de juiste doeltabel aanmaken en vullen met de gegevens die je er in wil hebben. In zijn simpelste vorm haal je met een SELECT DISTINCT alle visits op uit de brontabel. In het script bouw je de overige queries op aan de hand van de verkregen visits. Maar als je toch aan het scripten gaat kan eea allicht wat handiger...

Regeren is vooruitschuiven


  • justmental
  • Registratie: April 2000
  • Niet online

justmental

my heart, the beat

code:
1
2
3
4
5
6
7
8
select siteid
,      status
,      sum(decode (visit, 'W1', 1, 0)) count_w1
,      sum(decode (visit, 'W2', 1, 0)) count_w2
,      sum(decode (visit, 'W3', 1, 0)) count_w3
from   tabel
group by siteid
,      status

Who is John Galt?