Avatar billede zeth Nybegynder
27. september 2007 - 04:17 Der 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!
Avatar billede lorentsnv Nybegynder
27. september 2007 - 08:25 #1
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
Avatar billede lorentsnv Nybegynder
27. september 2007 - 08:27 #2
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
Avatar billede zeth Nybegynder
28. september 2007 - 00:29 #3
Tak for svaret. Jeg får desværre følgende fejl:

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?
Avatar billede lorentsnv Nybegynder
28. september 2007 - 07:30 #4
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.
Avatar billede zeth Nybegynder
28. september 2007 - 18:10 #5
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 :-)
Avatar billede zeth Nybegynder
28. september 2007 - 18:11 #6
Lige et sidste spørgsmål: Er pivot funktionen meget krævende? Jeg får omkring 2000 rows tilbage - er det noget problem?
Avatar billede lorentsnv Nybegynder
29. september 2007 - 18:19 #7
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
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