Comment append des colonnes correspondantes à un set de données PIVOT

À l'aide de Microsoft SQL Server 2012.

J'ai une table

PartID |TypeSet | Setting | ObservID |TransDate --------------------------------------------- 1 A 456 12 10/20/2015 1 A 377 12 10/20/2015 1 A 425 12 10/20/2015 1 A 665 12 10/20/2015 1 A 543 12 10/20/2015 1 A 554 12 10/20/2015 1 B 34 41 10/21/2015 1 B 27 41 10/21/2015 1 B 27 41 10/21/2015 1 B 29 41 10/21/2015 1 C 1299 12 10/20/2015 1 C 1227 12 10/20/2015 

Je voudrais l'afficher comme suit. Une ligne groupée sur PartID.

 PartID | A Avg | B Avg | C Avg | A ObservID | B ObservID | C ObservID --------------------------------------------------------------------- 1 503 29 1263 12 41 12 

Je ne peux pas afficher les ObservID sans afficher un set de données de return à plusieurs lignes. Je n'ai aucun problème avec les moyennes A, B et C avec cette requête:

  SELECT PartID ,[A] as 'A Average' ,[B] as 'B Average' ,[C] as 'C Average' -- ,(ObservID) --,CASE WHEN [A] = 'A Average' THEN max([ObservID]) END as 'A Ob' --,CASE WHEN [B] = 'B Average' THEN max([ObservID]) END as 'B Ob' -- ,CASE WHEN [C] = 'C Average' THEN max([ObservID]) END as 'C Ob' FROM (SELECT PartID ,TypeSet ,Setting --,ObservID FROM #Temp1 ) as MeasData PIVOT ( AVG(Setting) FOR [TypeSet] in ( [A], [B], [C]) ) as PivotTable 

Vous pouvez voir dans la requête ci-dessus où j'ai essayé d'get ObservID, mais quand je décommente ces lignes, des erreurs se produisent. Quelques notes: Les ObservID restront cohérents pour chaque TypeSet.

Voici datatables:

 create table #Temp1 ( PartID INT , TypeSet VARCHAR(10) , Setting INT , ObservID INT , TransDate Date ) INSERT INTO #Temp1(PartID, TypeSet, Setting, ObservID, TransDate) VALUES (1, 'A', 456, 12, '10/20/2015'), (1, 'A', 377, 12, '10/20/2015'), (1, 'A', 425, 12, '10/20/2015'), (1, 'A', 665, 12, '10/20/2015'), (1, 'A', 543, 12, '10/20/2015'), (1, 'A', 554, 12, '10/20/2015'), (1, 'B', 34, 41, '10/21/2015'), (1, 'B', 27, 41, '10/21/2015'), (1, 'B', 27, 41, '10/21/2015'), (1, 'B', 29, 41, '10/21/2015'), (1, 'C', 1299, 12, '10/20/2015'), (1, 'C', 1227, 12, '10/20/2015') 

Est-ce que ma sortie désirée est possible avec l'opération PIVOT? Ou devrais-je aller la route de plusieurs JOINs sur la table pour chaque type?

Vous pouvez le faire en utilisant l' agrégation conditionnelle :

 SELECT PartID, AVG(CASE WHEN TypeSet = 'A' THEN Setting END) AS 'A Avg', AVG(CASE WHEN TypeSet = 'B' THEN Setting END) AS 'B Avg', AVG(CASE WHEN TypeSet = 'C' THEN Setting END) AS 'C Avg', MAX(CASE WHEN TypeSet = 'A' THEN ObservID END) AS 'A ObservID', MAX(CASE WHEN TypeSet = 'B' THEN ObservID END) AS 'B ObservID', MAX(CASE WHEN TypeSet = 'C' THEN ObservID END) AS 'C ObservID' FROM #Temp1 GROUP BY PartID 
  WITH avgPivot AS ( SELECT PartID,[a] as A_Avg,[b] as B_Avg,[c] as C_Avg FROM ( SELECT PartID, TypeSet, Setting, ObservID FROM #Temp1 ) As S PIVOT ( AVG(Setting) FOR TypeSet in([a],[b],[c]) ) AS pvt ), maxPivot AS ( SELECT [a] as A_ObservID, [B]B_ObservID, [c] as c_ObservID FROM ( SELECT PartID, TypeSet, Setting, ObservID FROM #Temp1 ) As S PIVOT ( max(ObservID) FOR TypeSet in([a],[b],[c]) ) AS pvt ) SELECT distinct * FROM avgPivot M cross JOIN maxPivot A