SQL / TSQL: Verwenden von PIVOT auf mehreren Tabellen

Ich versuche, zwei ähnliche Probleme mit PIVOT in SQL zu lösen. Ich habe drei tische:

  • Erstes mit Spalten: orderid, empid, orderdate;
  • Zweitens mit Spalten: orderid, productid, unitprice
  • Dritter mit Spalten: Empid, Vorname, Nachname und so weiter (andere Informationen über Arbeiter)

Jetzt muss ich PIVOT benutzen, um so etwas zu bewältigen:

empid firstname lastname 2006 2007 2008 1 aaa bbb 1 55 77 1 aaa bbb 2 58 79 2 xxx ccc 4 59 82 ....................................... 

Wo Zahlen in 2006, 2007, 2008 Spalten sind Ordnungen für jedes Jahr zugeordnet.

Ich habe so etwas (Abfrage innerhalb von Pivott funktioniert gut):

 WITH Pivott AS ( SELECT so.empid, YEAR(so.orderdate), so.orderid, hr.lastname, hr.firstname FROM Sales.Orders so LEFT OUTER JOIN HR.Employees hr ON so.empid = hr.empid ) SELECT YEAR(orderdate), [2006], [2007], [2008] FROM Pivott PIVOT (SUM(orderid) FOR YEAR(orderdate) IN [2006], [2007], [2008]) AS PIV; 

Und das zweite Problem:

Ich versuche, PIVOT zu benutzen, um so etwas auch zu bewältigen:

 empid firstname lastname 2006 2007 2008 1 aaa bbb 453 34 77 2 vvv kkk 345 89 123 3 xxx ccc 453 12 82 ....................................... 

Wo Zahlen in 2006, 2007, 2008 Spalten sind die Summe aller Preise von Aufträgen des Arbeitnehmers (Empid) in einem bestimmten Jahr durchgeführt.

Ich habe das:

 WITH Pivott AS ( SELECT so.empid, YEAR(so.orderdate) AS YEAR, so.orderid AS ORDERS, hr.lastname, hr.firstname, s.unitprice AS SUMA FROM Sales.Orders so LEFT OUTER JOIN HR.Employees hr ON so.empid = hr.empid INNER JOIN Sales.OrderDetails s ON so.orderid = s.orderid ) SELECT YEAR(orderdate), [2006], [2007], [2008] FROM Pivott PIVOT (SUM(unitprice) FOR YEAR(orderdate) IN ([2006], [2007], [2008])) AS PIV; 

Was muss ich ändern, um meine gewünschte performance zu erreichen?

Danke für deine time!

Es sieht so aus, als hättest du versucht, den Pivot-Befehl gegen einen CTE anzuwenden

Versuche dies;

 ;WITH pvtCTE AS (SELECT so.empid, YEAR(so.orderdate) AS SalesYEAR, --so.orderid AS ORDERS, /** removed from grouping**/ hr.lastname, hr.firstname, SUM(ISNULL(s.unitprice,0.00)) as unitprice /** pre grouping adjusted per comment**/ FROM Sales.Orders so left outer join HR.Employees hr on so.empid = hr.empid inner join Sales.OrderDetails s on so.orderid = s.orderid GROUP BY so.empid, YEAR(so,orderDate), hr.lastname, hr.firstname --added for aggregated CTE results ) SELECT empid, firstname, lastname, [2006], [2007], [2008] FROM (SELECT * FROM pvtCTE) p PIVOT ( SUM(unitprice) FOR SalesYEAR IN ([2006],[2007],[2008]) ) as pvt;