2013-04-17 33 views
8

Tôi có một bảng trông tương tự như sau đây:SQL - Lấy dữ liệu từ nhiều hàng vào đơn hàng

SetId  AppCode  AppEventId  EventId  FieldId  ValueData 
2012/2013  1000   361616    16   1   UNI  
2012/2013  1000   361616    16   2   Isolation 
2012/2013  1000   361616    16   3   DN 
2012/2013  1050   378194    16   1   BUL 
2012/2013  1050   378194    16   2   Isolation 
2012/2013  1050   378194    16   3   RD 

Tôi muốn có thể kết hợp tất cả những gì dữ liệu khi họ có AppCode cùng.

nào sẽ trông như thế này:

SetId  AppCode  AppEventId  EventId  ValueData1  ValueData2  ValueData3 
2012/2013  1000   361616    16   UNI   Isolation  DN 
2012/2013  1050   378194    16   BUL   Isolation  RD 
+3

** PIVOT ** Là câu trả lời. Cho chúng tôi thấy những gì bạn đã thử. – Luv

+0

Xin chào, tôi tin rằng bảng của bạn không tuân thủ các quy tắc bình thường hóa. bạn nên xem xét lại cấu trúc bảng của mình trước tiên. –

+0

Cảm ơn Luv tôi sẽ xem xét PIVOT. – dawsonz

Trả lời

14

Hãy thử điều này

SELECT SetId, AppCode, AppEventId, EventId 
    ,max(CASE WHEN FieldId = 1 THEN ValueData END) AS ValueData1 
    ,max(CASE WHEN FieldId = 2 THEN ValueData END) AS ValueData2 
    ,max(CASE WHEN FieldId = 3 THEN ValueData END) AS ValueData3 
    FROM Table_Name 
    GROUP BY SetId,AppCode,AppEventId,EventId 
+0

Hoạt động thực sự tốt, cảm ơn bạn Vassy. Nhiều đánh giá cao. – dawsonz

+0

Tôi rất vui vì nó đã giúp – bvr

+0

@bvr giống nhau không hiệu quả đối với tôi với máy chủ sql 2008. – User

2

UPDATE:

Cải thiện câu trả lời -

DECLARE @temp TABLE 
(
     SetId VARCHAR(9)  
     , AppCode CHAR(4)  
     , AppEventId INT  
     , EventId INT  
     , FieldId TINYINT  
     , ValueData VARCHAR(50) 
) 

INSERT INTO @temp (SetId, AppCode, AppEventId, EventId, FieldId, ValueData) 
VALUES 
    ('2012/2013',  '1000',   361616,    16,   1,   'UNI'),  
    ('2012/2013',  '1000',   361616,    16,   2,   'Isolation'), 
    ('2012/2013',  '1000',   361616,    16,   3,   'DN'), 
    ('2012/2013',  '1050',   378194,    16,   1,   'BUL'), 
    ('2012/2013',  '1050',   378194,    16,   2,   'Isolation'), 
    ('2012/2013',  '1050',   378194,    16,   3,   'RD') 

;WITH tbl AS 
(
    SELECT 
      PK = t.SetId + t.AppCode + CAST(AppEventId AS VARCHAR(10)) + CAST(EventId AS VARCHAR(5)) 
      , t.SetId 
      , t.AppCode 
      , t.AppEventId 
      , t.EventId 
      , t.FieldId 
      , t.ValueData 
    FROM @temp t 
) 
SELECT DISTINCT 
     t.SetId 
    , t.AppCode 
    , t.AppEventId 
    , t.EventId 
    , t2.ValueData 
    , t3.ValueData 
    , t4.ValueData 
FROM tbl t 
JOIN tbl t2 ON t.PK = t2.PK AND t2.FieldId = 1 
JOIN tbl t3 ON t.PK = t3.PK AND t3.FieldId = 2 
JOIN tbl t4 ON t.PK = t4.PK AND t4.FieldId = 3 

Không tao nhã, nhưng nó hoạt động -

DECLARE @temp TABLE 
(
     SetId VARCHAR(9)  
     , AppCode CHAR(4)  
     , AppEventId INT  
     , EventId INT  
     , FieldId TINYINT  
     , ValueData VARCHAR(50) 
) 

INSERT INTO @temp (SetId, AppCode, AppEventId, EventId, FieldId, ValueData) 
VALUES 
    ('2012/2013',  '1000',   361616,    16,   1,   'UNI'),  
    ('2012/2013',  '1000',   361616,    16,   2,   'Isolation'), 
    ('2012/2013',  '1000',   361616,    16,   3,   'DN'), 
    ('2012/2013',  '1050',   378194,    16,   1,   'BUL'), 
    ('2012/2013',  '1050',   378194,    16,   2,   'Isolation'), 
    ('2012/2013',  '1050',   378194,    16,   3,   'RD') 

SELECT t.SetId 
    , t.AppCode 
    , t.AppEventId 
    , t.EventId 
    , t2.ValueData 
    , t3.ValueData 
    , t4.ValueData 
FROM (
    SELECT 
      t.SetId 
     , t.AppCode 
     , t.AppEventId 
     , t.EventId 
     , FieldId1 = MAX(CASE WHEN t.FieldId = 1 THEN t.FieldId END) 
     , FieldId2 = MAX(CASE WHEN t.FieldId = 2 THEN t.FieldId END) 
     , FieldId3 = MAX(CASE WHEN t.FieldId = 3 THEN t.FieldId END) 
    FROM @temp t 
    GROUP BY 
      t.SetId 
     , t.AppCode 
     , t.AppEventId 
     , t.EventId 
) t 
JOIN @temp t2 ON t.SetId = t2.SetId 
     AND t.AppCode = t2.AppCode 
     AND t.AppEventId = t2.AppEventId 
     AND t.EventId = t2.EventId 
     AND t2.FieldId = 1 
JOIN @temp t3 ON t.SetId = t3.SetId 
     AND t.AppCode = t3.AppCode 
     AND t.AppEventId = t3.AppEventId 
     AND t.EventId = t3.EventId 
     AND t3.FieldId = 2 
JOIN @temp t4 ON t.SetId = t4.SetId 
     AND t.AppCode = t4.AppCode 
     AND t.AppEventId = t4.AppEventId 
     AND t.EventId = t4.EventId 
     AND t4.FieldId = 3 
7

Điều này có thể được thực hiện bằng cách áp dụng PIVOT chức năng mà đã được thực hiện bắt đầu có mặt trong SQL Server 2005.

Nếu bạn có một số được biết đến hoặc thiết lập các giá trị mà bạn muốn chuyển đổi thành các cột , sau đó ou có thể mã hóa truy vấn:

select setid, appcode, appeventid, 
    eventid, 
    ValueData1, ValueData2, ValueData3 
from 
(
    select setid, appcode, appeventid, 
    eventid, 
    'ValueData'+cast(FieldId as varchar(10)) FieldId, 
    ValueData 
    from yt 
) d 
pivot 
(
    max(ValueData) 
    for FieldId in (ValueData1, ValueData2, ValueData3) 
) piv; 

Xem SQL Fiddle with Demo.

Nhưng nếu bạn có một số không rõ các giá trị, sau đó bạn sẽ cần phải sử dụng SQL động:

DECLARE @cols AS NVARCHAR(MAX), 
    @query AS NVARCHAR(MAX) 

select @cols = STUFF((SELECT distinct ',' + QUOTENAME('ValueData'+cast(FieldId as varchar(10))) 
        from yt 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

set @query = 'SELECT setid, appcode, appeventid, 
        eventid,' + @cols + ' 
      from 
      (
       select setid, appcode, appeventid, 
        eventid, 
        ''ValueData''+cast(FieldId as varchar(10)) FieldId, 
        ValueData 
       from yt 
      ) x 
      pivot 
      (
       max(ValueData) 
       for FieldId in (' + @cols + ') 
      ) p ' 

execute(@query); 

Xem SQL Fiddle with Demo. Cả hai truy vấn đều cho kết quả tương tự:

|  SETID | APPCODE | APPEVENTID | EVENTID | VALUEDATA1 | VALUEDATA2 | VALUEDATA3 | 
------------------------------------------------------------------------------------- 
| 2012/2013 | 1000 |  361616 |  16 |  UNI | Isolation |   DN | 
| 2012/2013 | 1050 |  378194 |  16 |  BUL | Isolation |   RD | 
Các vấn đề liên quan