2016-09-16 24 views
6

Sử dụng Microsoft SQL Server 2012.Làm thế nào để thêm các cột tương ứng với một tập dữ liệu PIVOT

Tôi có một bảng:

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 

Tôi muốn hiển thị nó như sau. Một hàng được nhóm trên PartID.

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

Tôi không thể hiển thị ObservID để tạo bộ dữ liệu trả về nhiều hàng. Tôi không có vấn đề với A, B và C trung bình với truy vấn này:

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 

Bạn có thể nhìn thấy trong các truy vấn trên, nơi tôi đã cố gắng để có được ObservID trong nó, nhưng khi tôi bỏ ghi chú những dòng này, lỗi xảy ra. Một số lưu ý: Các ObservID sẽ luôn phù hợp với từng TypeSet.

Dưới đây là các dữ liệu:

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') 

là đầu ra mong muốn của tôi càng tốt với những hoạt động PIVOT? Hoặc tôi nên đi các tuyến đường của nhiều JOINs trên bàn cho mỗi Typeset?

Trả lời

3

Bạn có thể làm điều đó bằng có điều kiện tập hợp:

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 
+0

này là rất tốt. Cho tôi những gì tôi cần. Mối quan tâm duy nhất của tôi là hiệu suất nhưng đồng thời, tôi đã không xem xét các kế hoạch giải thích ... Nhưng cảm ơn bạn vì điều này. – Charlie

+1

@Charlie Điều này phải nhanh như bất kỳ truy vấn nào sử dụng 'PIVOT'. 'PIVOT' thực sự là cú pháp đường cho tập hợp có điều kiện. –

0
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 
+0

Điều này mang lại cho tôi NULL và tạo một tập dữ liệu nhiều hàng. – Charlie

+0

u cần một hàng duy nhất ....... – Chanukya

+0

Xin lỗi vì không rõ ràng nhưng có, một hàng dựa trên PartID – Charlie

Các vấn đề liên quan