एसक्यूएल सर्वर 2008 पिवट और कंसैट - एसक्यूएल, एसक्यूएल-सर्वर, पिवट, कॉन्सट

क्षमा करें, मैं SQL में नया हूँ इसलिए मैं सोच रहा था कि क्या कोई मेरी निम्न में से मदद कर सकता है:

मेरे पास एक टेबल है

+--------+----------+
|Position|PlayerName|
+--------+----------+
|Forward |Tom       |
+--------+----------+
|Forward |John      |
+--------+----------+
|Center  |Dave      |
+--------+----------+
|Defense |Harry     |
+--------+----------+
|Center  |Bob       |
+--------+----------+
|Defense |James     |
+--------+----------+
|Goalie  |Mike      |
+--------+----------+
|Goalie  |Tim       |
+--------+----------+

परिणाम

+---------+---------+------------+---------+
|Forward  |Center   |Defense     |Goalie   |
+---------+---------+------------+---------+
|Tom, John|Dave, Bob|Harry, James|Mike, Tim|
+---------+---------+------------+---------+

उत्तर:

जवाब के लिए 2 № 1

परिणाम प्राप्त करने के लिए, आपको यह दो चरणों में करना होगा। सबसे पहले, आपको सभी को मिलाना होगा PlayerNames प्रत्येक के लिए Position। एक बार जब आपके पास सूची होगी, तो आप पंक्तियों से डेटा को कॉलम में पिवट कर सकते हैं।

चूंकि आप SQL सर्वर का उपयोग कर रहे हैं, इसलिए डेटा को अलग करने के कुछ अलग तरीके हैं। आप उपयोग कर सकते हैं STUFF तथा FOR XML PATH:

select t1.position,
STUFF(
(SELECT ", " + t2.PlayerName
FROM yourtable t2
where t1.position = t2.position
FOR XML PATH (""))
, 1, 1, "")  AS PlayerName
from yourtable t1

देख डेमो के साथ एसक्यूएल फिडल। इससे आपका डेटा परिणाम में मिलता है:

| POSITION |    PLAYERNAME |
|----------|---------------|
|  Forward |     Tom, John |
|   Center |     Dave, Bob |
|  Defense |  Harry, James |

अब जब आपका डेटा समाप्‍त हो गया है, तो आप डेटा को एग्रेट फ़ंक्शन का उपयोग करके एक CASE एक्‍सप्रेशन के साथ परिवर्तित कर सकते हैं या PIVOT का उपयोग कर सकते हैं।

मामले के साथ एकत्र:

;with cte as
(
select t1.position,
STUFF(
(SELECT ", " + t2.PlayerName
FROM yourtable t2
where t1.position = t2.position
FOR XML PATH (""))
, 1, 1, "")  AS PlayerNames
from yourtable t1
)
select
max(case when position = "Forward" then PlayerNames end) Forward,
max(case when position = "Center" then PlayerNames end) Center,
max(case when position = "Defense" then PlayerNames end) Defense,
max(case when position = "Goalie" then PlayerNames end) Goalie
from cte

देख डेमो के साथ एसक्यूएल फिडल

धुरी:

;with cte as
(
select t1.position,
STUFF(
(SELECT ", " + t2.PlayerName
FROM yourtable t2
where t1.position = t2.position
FOR XML PATH (""))
, 1, 1, "")  AS PlayerName
from yourtable t1
)
select Forward, Center, Defense, Goalie
from cte
pivot
(
max(playername)
for position in (Forward, Center, Defense, Goalie)
) piv;

देख डेमो के साथ एसक्यूएल फिडल

दोनों एक परिणाम देते हैं:

|    FORWARD |     CENTER |       DEFENSE |     GOALIE |
|------------|------------|---------------|------------|
|  Tom, John |  Dave, Bob |  Harry, James |  Mike, Tim |

संबंधित सवाल
सबसे लोकप्रिय