14. marts 2005 - 13:05Der 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
Denne side indeholder artikler med forskellige perspektiver på Identity & Access Management i private og offentlige organisationer. Artiklerne behandler aktuelle IAM-emner og leveres af producenter, rådgivere og implementeringspartnere.
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.
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')
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')
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 '' :)
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.
Synes godt om
Ny brugerNybegynder
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.