it-swarm.com.de

SQL Server Join-Tabellen und Pivot

Ich habe zwei Tabellen mit Daten

TABELLE 1

    ---------------------------------------------------
    | SALEID | SOLDBY | SALEPRICE | MARGIN |   DATE   |
    |  1     |  'aa'  |  10,000   |   10   | 2013-1-1 |
    |  2     |  'bb'  |  25,000   |    5   | 2013-5-1 |

TABELLE 2

    ---------------------------------------------------
    | SALEITEMID | SALEID | SALEPRICE | CATEGORY |
    |  1         |  1     |   6,000   | BOOKS    |
    |  2         |  1     |   4,000   | PRINTING |
    |  3         |  2     |   5,000   | BOOKS    |
    |  4         |  2     |   12,000  | PRINTING |
    |  5         |  2     |   8,000   | DVD      |

Ich brauche eine Abfrage, die produzieren wird

TAB

    --------------------------------------------------------------------------------
    | SALEID | SOLDBY | SALEPRICE | MARGIN |   DATE   |  BOOKS  | PRINTING | DVD
    |  1     |  'aa'  |  10,000   |   10   | 2013-1-1 |  6,000  |  4,000   | 0
    |  2     |  'bb'  |  25,000   |    5   | 2013-5-1 |  5,000  | 12,000   | 8,000

Ich bin ziemlich neu im Schwenken und nicht sicher, ob das Schwenken das Richtige ist oder nicht.

25
Null Head

Das sollte funktionieren:

WITH Sales AS (
   SELECT
      S.SaleID,
      S.SoldBy,
      S.SalePrice,
      S.Margin,
      S.Date,
      I.SalePrice,
      I.Category
   FROM
      dbo.Sale S
      INNER JOIN dbo.SaleItem I
         ON S.SaleID = I.SaleID
)
SELECT *
FROM
   Sales
   PIVOT (Max(SalePrice) FOR Category IN (Books, Printing, DVD)) P
;

Oder alternativ:

SELECT
   S.SaleID,
   S.SoldBy,
   S.SalePrice,
   S.Margin,
   S.Date,
   I.Books,
   I.Printing,
   I.DVD
FROM
   dbo.Sale S
   INNER JOIN (
      SELECT *
      FROM
         (SELECT SaleID, SalePrice, Category FROM dbo.SaleItem) I
         PIVOT (Max(SalePrice) FOR Category IN (Books, Printing, DVD)) P
   ) I ON S.SaleID = I.SaleID
;

Diese haben die gleiche Ergebnismenge und können vom Abfrageoptimierer zwar gleich behandelt werden, möglicherweise jedoch nicht. Der große Unterschied macht sich bemerkbar, wenn Sie Bedingungen in die Tabelle Sale einfügen. Sie sollten testen, welche Abfrage besser funktioniert.

Darf ich jedoch vorschlagen, dass Sie das Schwenken in der Präsentationsebene durchführen? Wenn Sie beispielsweise SSRS verwenden, ist es recht einfach, ein Matrix-Steuerelement zu verwenden, das das gesamte Schwenken für Sie übernimmt. Das ist am besten, denn wenn Sie dann ein neues Category hinzufügen, müssen Sie nicht Ihren gesamten SQL-Code ändern!

Es gibt eine Möglichkeit, die zu pendelnden Spaltennamen dynamisch zu finden, es handelt sich jedoch um dynamisches SQL. Ich empfehle das auch nicht wirklich als den besten Weg, obwohl es möglich ist.

Eine andere Möglichkeit, die könnte funktioniert, besteht darin, diese Abfrage vorab zu verarbeiten, dh einen Auslöser für die Tabelle Category festzulegen, der eine Ansicht so umschreibt, dass sie alle vorhandenen Kategorien enthält. Dies löst viele der anderen Probleme, die ich erwähnt habe, aber auch hier ist die Verwendung der Präsentationsebene am besten.

Anmerkung: Wenn Ihre Spaltennamen (die früher Werte waren) Leerzeichen haben, Zahlen sind oder mit einer Zahl beginnen oder keine gültigen Bezeichner sind, müssen Sie sie in eckigen Klammern wie in PIVOT (Max(Value) FOR CategoryId IN ([1], [2], [3], [4])) P. Alternativ können Sie die Werte ändern, bevor sie zum Teil PIVOT der Abfrage gelangen, um Buchstaben voranzustellen oder Leerzeichen zu entfernen, damit die Spaltenliste nicht maskiert werden muss. Weitere Informationen hierzu finden Sie in den Regeln für Bezeichner in SQL Server.

44
ErikE