Avatar billede me64 Nybegynder
14. marts 2005 - 13:05 Der er 5 kommentarer og
1 løsning

Transform / Pivot i SQL7

Jeg er rookie indenfor Stored Procedures, så spørgsmålet er måske banalt.

Er der en (optimal) metode til at få "vendt" nedenstående tabeller
---------------------------------------------------
Tabel1:
profilID  Feltnr  Value
90        1    Hans Hansen
90        2    Byvej 3
100        1    Jens Jensen
100        2    Søgade 4
---------------------------------------------------
CfgTabel:
FeltNr      Titel
1          Navn
2          Adresse
---------------------------------------------------
Output skulle gerne ende som:

Navn          Adresse
Hans Hansen    Byvej 3
Jens Jensen    Søgade 4


I access kunne man benytte Transform og pivot til at gøre det, men det ser ikke ud til at virke i SQL7
Avatar billede janus_007 Nybegynder
14. marts 2005 - 13:33 #1
Hverken i SQL7 eller SQL2000 kan du gøre den slags, men pivot og unpivot kommer med i SQL2005 wee ;O)
Avatar billede venne Nybegynder
14. marts 2005 - 15:03 #2
Du kan komme et stykke af vejen med GROUP BY og CASE. Følgende giver dig det du ønsker:

SELECT MAX(CASE WHEN Tabel1.Feltnr = 1 THEN Value ELSE '' END) AS Navn,
      MAX(CASE WHEN Tabel1.Feltnr = 2 THEN Value ELSE '' END) AS Adresse
FROM Tabel1
INNER JOIN CfgTabel ON Tabel1.Feltnr = CfgTabel.Feltnr
GROUP BY profilID

Godt nok får du ikke fuld dynamik men data bliver da vendt, på en måde.
Avatar billede me64 Nybegynder
14. marts 2005 - 15:45 #3
Ok det ligner en løsning tæt på målet.
Manglen på den fulde dynamik kan jeg snildt leve med.

jeg får dog kun een kolonne ud:

Adresse
Hans Hansen                                                     
Jens Jensen                                                     

Kan du se hvad der mangler? :

TABEL1: -------------------------------
    ProfilIDFeltNr    Value
    90    1    Hans Hansen                                     
    90    2    Byvej 3                                         
    100    1    Jens Jensen                                     
    100    2    Søgade 4   

CFGTABEL: --------------------------
      FeltNr    Titel
    1    sNavn   
    2    Adresse   

Stored Proc: ------------------------
         
Alter PROCEDURE crosstab

AS

EXEC ('SELECT
MAX(CASE WHEN Tabel1.Feltnr = 1 THEN Value ELSE '' END) AS sNavn,
MAX(CASE WHEN Tabel1.Feltnr = 2 THEN Value ELSE '' END) AS Adresse
FROM Tabel1
INNER JOIN CfgTabel ON Tabel1.Feltnr = CfgTabel.Feltnr
GROUP BY profilID')
Avatar billede me64 Nybegynder
14. marts 2005 - 15:56 #4
Ok følgende løste problemet (Null istedet for '')

EXEC ('SELECT
MAX(CASE WHEN Tabel1.Feltnr = 1 THEN Value ELSE null END) AS sNavn,
MAX(CASE WHEN Tabel1.Feltnr = 2 THEN Value ELSE null END) AS Adresse
FROM Tabel1
INNER JOIN CfgTabel ON Tabel1.Feltnr = CfgTabel.Feltnr
GROUP BY profilID')

1000 Tak for svaret venne, der er points på vej.
Avatar billede venne Nybegynder
14. marts 2005 - 15:59 #5
Tak, men hvorfor vil du lave en EXEC - kan du ikke bare lave en SELECT? Det er nemmere at skrive og performer bedre. Og der havde heller ikke været problemer med '' :)
Avatar billede me64 Nybegynder
14. marts 2005 - 16:11 #6
Hehe det var en ren tankebøf. Jeg har siddet i weekenden og testet adskillige scripts mht transformering....så der var tale om genbrugspapir  ;)

Anede ikke at det havde betydning for ''/Null.

Tak for info.
Avatar billede Ny bruger Nybegynder

Din løsning...

Tilladte BB-code-tags: [b]fed[/b] [i]kursiv[/i] [u]understreget[/u] Web- og emailadresser omdannes automatisk til links. Der sættes "nofollow" på alle links.

Loading billede Opret Preview
Kategori
Computerworld tilbyder specialiserede kurser i database-management

Log ind eller opret profil

Hov!

For at kunne deltage på Computerworld Eksperten skal du være logget ind.

Det er heldigvis nemt at oprette en bruger: Det tager to minutter og du kan vælge at bruge enten e-mail, Facebook eller Google som login.

Du kan også logge ind via nedenstående tjenester