27. september 2007 - 04:17Der er
6 kommentarer og 1 løsning
PIVOT funktionen
Hej alle,
Jeg har følgende query:
SELECT Varer.Id, Varer.Navn, Værdier.Mængde, Værdier.KompId FROM Komp INNER JOIN Værdier ON Komp.ID = Værdier.KompId INNER JOIN Varer ON Værdier.Id = Varer.Id WHERE (Komp.ID = 1 OR Komp.ID = 3 OR Komp.ID = 8)
Jeg vil have kolonnerne Varer.Id, Varer.Navn og så tre kolonner hvor Komp.ID = 1, 3 eller 8 og så selvfølgelig deres tilhørende mængder, varenavne, vare id'er som rows. Jeg ved at jeg skal bruge PIVOT funktionen, men synes ikke jeg kan få det til at virke ligegyldigt hvor meget jeg prøver.. Og så gør det det heller ikke lettere af at jeg bruger JOINs.. Nogen forslag? På forhånd tak!
Jeg har ikke checket nedenstående, men jeg vil mene du gør det nemmere for dig selv, ved at putte din SQL ind i FROM delen på en ny SQL som du bruger til at lave Pivot med.
SELECT Id, Navn, [1], [3], [8] FROM ( SELECT Varer.Id, Varer.Navn, Værdier.Mængde, Værdier.KompId FROM Komp INNER JOIN Værdier ON Komp.ID = Værdier.KompId INNER JOIN Varer ON Værdier.Id = Varer.Id WHERE (Komp.ID IN(1,3,8) ) p PIVOT ( SUM(Mængde) FOR KompID IN ([1],[3],[8]) ) as pvt ORDER BY ID
Der mangler ihvertfald en parantese i linien der starter med '(Komp.ID IN'
SELECT Id, Navn, [1], [3], [8] FROM ( SELECT Varer.Id, Varer.Navn, Værdier.Mængde, Værdier.KompId FROM Komp INNER JOIN Værdier ON Komp.ID = Værdier.KompId INNER JOIN Varer ON Værdier.Id = Varer.Id WHERE Komp.ID IN(1,3,8) ) p PIVOT ( SUM(Mængde) FOR KompID IN ([1],[3],[8]) ) as pvt ORDER BY ID
Msg 107, Level 15, State 1, Line 17 The column prefix 'Komp' does not match with a table name or alias name used in the query. Msg 207, Level 16, State 1, Line 1 Invalid column name 'Id'.
Jeg har prøvet at rode lidt rundt på det, men kan stadig ikke få det til at virke.. Ved du hvad der er galt?
Prøv at kør den inderste SQL, og se om den virker som forventet: SELECT Varer.Id, Varer.Navn, Værdier.Mængde, Værdier.KompId FROM Komp INNER JOIN Værdier ON Komp.ID = Værdier.KompId INNER JOIN Varer ON Værdier.Id = Varer.Id WHERE Komp.ID IN(1,3,8)
Fejlmeddelelsen kunne tyde på at den ikke finder tabellen Komp. Ved at teste ovenstående SQL, ved vi ihvertfald om problemet ligger i den inderste SQL, eller om det Pivot fuktionen som giver os problemer.
Kanon, jeg har fået det til at virke nu. Det inderste query virkede fint, det var min FOR og ORDER BY der var galt med. Mange tak for hjælpen! Opret et svar så du kan få point :-)
Det er svært at svare generelt på om returnerig af 2000 rækker er meget krævende. Isoleret set, tror jeg ikke det er noget problem. Men det afhænger lidt af størrelse på server, antal brugere, hvor ofte du laver tilsvarende forespørgsler på 2000 rækker. Det afhænger også af hvordan de underliggende tabeller er indexeret.
Hvis der er hurtig svartid på den første pivot forespørgsel, er det et godt tegn på at du sansynligvis ikke behøver at bekymre dig. Hvis det første Pivot forespørgsel tager en del tid, og du ved at denne type forespørgsler ofte vil blive sendt, bør du tune indexer så godt du kan, og monitorere svartider over en periode.
Jeg kan desværre ikke give dig et entydig svar på ovenstående, andet end at du må prøve dig frem.
Mvh. Lorents
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.