2013-02-01 22 views
15

मेरे पास एक तालिका में पंक्तियों का एक समूह है जिसमें आईडी है। मैं कई स्तंभों के साथ पंक्तियों में इसे फ़्लैट करने की कोशिश कर रहा हूं। मैं लगभग निश्चित हूं कि मैंने इसे एक सीटीई और शायद विभाजन के साथ किया है।कॉलम में पंक्तियों को फ़्लैट करने की कोशिश कर रहे हैं

मैंने डुप्लिकेट डेटा को हटाने के लिए सीटीई का उपयोग किया है और मैंने सोचा कि मैंने ऐसा कुछ किया है जो मैं यहां पूरा करने की कोशिश कर रहा हूं। मैं व्यावहारिक समाधान (नीचे सूचीबद्ध) के साथ आने में सक्षम था लेकिन अभी भी एक और अधिक सुरुचिपूर्ण समाधान उपलब्ध होना चाहिए।

CREATE TABLE #MyTable (RowID int , field VARCHAR(10), value VARCHAR(10)) 

INSERT INTO #MyTable (RowID, field, value) VALUES (1, 'first', 'neil') 

INSERT INTO #MyTable (RowID, field, value) VALUES (2, 'first', 'bob' ) 

INSERT INTO #MyTable (RowID, field, value) VALUES (3, 'first', 'tom' ) 

INSERT INTO #MyTable (RowID, field, value) VALUES (1, 'last', 'young') 

INSERT INTO #MyTable (RowID, field, value) VALUES (2, 'last', 'dylan') 

INSERT INTO #MyTable (RowID, field, value) VALUES (3, 'last', 'petty') 

SELECT * FROM #mytable 

CTE/विभाजन के साथ यह पूरा करने के --trying:

SELECT rowid, 
    [first] = (Select value FROM #mytable where field = 'first' and rowid = t.rowid), 
    [last] = (Select value FROM #mytable where field = 'last' and rowid = t.rowid) 
FROM #mytable t 
GROUP BY rowid 

उत्तर

19

इस डेटा परिवर्तन एक PIVOT के रूप में जाना जाता है। SQL सर्वर 2005+ में एक फ़ंक्शन है जो इस प्रक्रिया को निष्पादित करेगा। :

select * 
from 
(
    SELECT * 
    FROM mytable 
) src 
pivot 
(
    max(value) 
    for field in (first, last) 
) piv 

SQL Fiddle with Demo देखें।

या आप एक CASE अभिव्यक्ति के साथ एक समग्र समारोह का उपयोग कर सकते हैं:

select rowid, 
    max(case when field = 'first' then value end) first, 
    max(case when field = 'last' then value end) last 
from MyTable 
group by rowid 

SQL Fiddle with Demo देखें।

आप एक से अधिक उपयोग कर सकते हैं अपनी मेज पर मिलती है:

select t1.rowid, 
    t1.value first, 
    t2.value last 
from mytable t1 
left join mytable t2 
    on t1.rowid = t2.rowid 
    and t2.field = 'last' 
where t1.field = 'first' 

देखें SQL Fiddle with Demo

परिणाम सभी संस्करणों के लिए एक ही है:

| ROWID | FIRST | LAST | 
------------------------- 
|  1 | neil | young | 
|  2 | bob | dylan | 
|  3 | tom | petty | 
+1

बहुत बहुत धन्यवाद। पिवट बिल्कुल वही है जो मैं ढूंढ रहा था। मैंने भी कोशिश की थी लेकिन अधिकतम() का उपयोग नहीं कर रहा था। एक बार फिर धन्यवाद। – boone

+0

@boone आपका स्वागत है !! :) – Taryn

+0

बहुत उपयोगी सुविधा, धन्यवाद – AlexFoxGill