2013-04-17 7 views
8

में एकाधिक पंक्तियों से डेटा ले लो मैं एक मेज है कि इस यहाँ के समान दिखता है है: जब वे एक ही AppCode हैएसक्यूएल - एकल पंक्ति

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 

मैं सक्षम चाहते हैं कि सभी डेटा गठबंधन करने के लिए।

कौन सा ऐसा दिखाई देगा:

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 ** क्या उत्तर है। हमें दिखाएं कि आपने क्या प्रयास किया है। – Luv

+0

हाय, मेरा मानना ​​है कि आपकी तालिका सामान्यीकरण नियमों का पालन नहीं करती है। आपको पहले अपनी टेबल संरचना पर पुनर्विचार करना चाहिए। –

+0

धन्यवाद लव मैं PIVOT में देखता हूँ। – dawsonz

उत्तर

14

प्रयास करें इस

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

वास्तव में अच्छा काम करता है, धन्यवाद वासी। बहुत सराहना की। – dawsonz

+0

मुझे खुशी है कि यह – bvr

+0

@bvr में मदद करता है, यह मेरे लिए एसक्यूएल सर्वर 2008 के साथ काम नहीं करता है। – User

2

अद्यतन:

जवाब सुधार -

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 

सुरुचिपूर्ण नहीं है, लेकिन यह काम करता है -

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

यह PIVOT समारोह जो एसक्यूएल सर्वर में शुरू उपलब्ध कराया गया था लगाने से किया जा सकता है 2005

आप मान कॉलम में बदलना चाहते हैं के एक ज्ञात या सेट नंबर है, तो , तो कहां क्वेरी को हार्ड-कोड कर सकते हैं:

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; 

SQL Fiddle with Demo देखें।

लेकिन अगर आप मूल्यों की संख्या ज्ञात नहीं है, तो आप गतिशील एसक्यूएल का उपयोग करने की आवश्यकता होगी:

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

SQL Fiddle with Demo देखें। दोनों प्रश्न एक ही परिणाम देते हैं:

|  SETID | APPCODE | APPEVENTID | EVENTID | VALUEDATA1 | VALUEDATA2 | VALUEDATA3 | 
------------------------------------------------------------------------------------- 
| 2012/2013 | 1000 |  361616 |  16 |  UNI | Isolation |   DN | 
| 2012/2013 | 1050 |  378194 |  16 |  BUL | Isolation |   RD | 
संबंधित मुद्दे