2009-08-27 17 views
92

बिना मैं इस तरह एक मेज है ...TSQL धुरी समेकित फ़ंक्शन

CustomerID DBColumnName Data 
-------------------------------------- 
1   FirstName  Joe 
1   MiddleName  S 
1   LastName  Smith 
1   Date   12/12/2009 
2   FirstName  Sam 
2   MiddleName  S 
2   LastName  Freddrick 
2   Date   1/12/2009 
3   FirstName  Jaime 
3   MiddleName  S 
3   LastName  Carol 
3   Date   12/1/2009 

और मैं यह चाहता हूँ ...

यह संभव धुरी का उपयोग कर है?

CustomerID FirstName MiddleName   LastName  Date 
---------------------------------------------------------------------- 
1   Joe    S    Smith   12/12/2009 
2   Sam    S    Freddrick  1/12/2009 
3   Jaime   S    Carol   12/1/2009 

उत्तर

77

आप MAX कुल का उपयोग कर सकते हैं, यह अभी भी काम करेगा। MAX का एक मान = वह मान ..

इस मामले में, आप ग्राहक पर 5 गुना भी शामिल हो सकते हैं, प्रति तालिका संदर्भ dbColumnName द्वारा फ़िल्टर करें। यह बेहतर काम कर सकता है।

+0

है कि वास्तव में अभ्यस्त अगर आप एक ही पहला नाम – Leonardo

+0

यही काम करेंगे के साथ 2 costumers है काम उत्पन्न। याद रखें कि DBColumnName मेटाडेटा है - आप सचमुच "ग्राहक आईडी = 1 और DBColumnName = 'FirstName' द्वारा फ़िल्टर करते हैं।बेशक, यदि आपके पास किसी दिए गए ग्राहक आईडी के लिए एकाधिक फर्स्टनाम पंक्तियां हैं, लेकिन यदि आप अपनी टेबल सही तरीके से बना रहे हैं तो ग्राहक आईडी और डीबीसीओलॉमनाम दोनों आपकी प्राथमिक कुंजी का हिस्सा हैं ... – 4AM

+0

@ क्या आप इसे करने के लिए कुछ कोड प्रदान कर सकते हैं? –

122

हाँ, लेकिन क्यों !!??

Select CustomerID, 
    Min(Case DBColumnName When 'FirstName' Then Data End) FirstName, 
    Min(Case DBColumnName When 'MiddleName' Then Data End) MiddleName, 
    Min(Case DBColumnName When 'LastName' Then Data End) LastName, 
    Min(Case DBColumnName When 'Date' Then Data End) Date 
    From table 
    Group By CustomerId 
+1

^^ यह मेरे लिए काम किया। PIVOT गैर-संख्यात्मक मानों के लिए कुशल नहीं है। – Dienekes

+3

मुझे यह पसंद है। महान काम किया! – uotonyh

+3

यह एक अच्छा विकल्प है। मैं अपनी क्वेरी में 'पिवट' का उपयोग कर रहा था, फिर मैंने इसे स्विच किया और दोनों को एक साथ चलाने के लिए निष्पादन योजना को देखा। इस दृष्टिकोण की लागत 8% और पिवट दृष्टिकोण 92% लिया! – mafue

5
SELECT 
main.CustomerID, 
f.Data AS FirstName, 
m.Data AS MiddleName, 
l.Data AS LastName, 
d.Data AS Date 
FROM table main 
INNER JOIN table f on f.CustomerID = main.CustomerID 
INNER JOIN table m on m.CustomerID = main.CustomerID 
INNER JOIN table l on l.CustomerID = main.CustomerID 
INNER JOIN table d on d.CustomerID = main.CustomerID 
WHERE f.DBColumnName = 'FirstName' 
AND m.DBColumnName = 'MiddleName' 
AND l.DBColumnName = 'LastName' 
AND d.DBColumnName = 'Date' 

संपादित करें: मैं एक संपादक & एसक्यूएल नहीं चला है बिना इस लिखा है। मुझे उम्मीद है, आपको विचार मिल जाएगा।

7

ठीक है, खराब प्रश्न के लिए खेद है। जीबीएन ने मुझे सही रास्ते पर ले लिया। यही वह है जिसे मैं किसी उत्तर में ढूंढ रहा था।

SELECT [FirstName], [MiddleName], [LastName], [Date] 
FROM #temp 
PIVOT 
( MIN([Data]) 
    FOR [DBColumnName] IN ([FirstName], [MiddleName], [LastName], [Date]) 
)AS p 

तो मैं थोड़ी देर के बयान का उपयोग करें और एक varchar के रूप में उपरोक्त कथन का निर्माण और dynmaic एसक्यूएल का उपयोग करने के लिए किया था।

इस

SET @fullsql = @fullsql + 'SELECT ' + REPLACE(REPLACE(@fulltext,'(',''),')','') 
SET @fullsql = @fullsql + 'FROM #temp ' 
SET @fullsql = @fullsql + 'PIVOT' 
SET @fullsql = @fullsql + '(' 
SET @fullsql = @fullsql + ' MIN([Data])' 
SET @fullsql = @fullsql + ' FOR [DBColumnName] IN '[email protected] 
SET @fullsql = @fullsql + ')' 
SET @fullsql = @fullsql + 'AS p' 

EXEC (@fullsql) 

थोड़ी देर के पाश का उपयोग कर @fulltext का निर्माण और मेज से बाहर अलग स्तंभ नाम का चयन करने के लिए एक के बाद की तरह कुछ का उपयोग करना। उत्तर के लिए धन्यवाद।

5

ओपी वास्तव में पता है कि कैसे देखते हैं agregation बिना लेकिन आप में से जो यहाँ आने के लिए पिवट करने के लिए जरूरत नहीं थी:

sql parameterised cte query

उस प्रश्न का उत्तर एक स्थिति है जहाँ एकत्रीकरण के बिना धुरी की जरूरत है शामिल है तो ऐसा करने का एक उदाहरण समाधान का हिस्सा है।

4
WITH pivot_data AS 
(
SELECT customerid, -- Grouping Column 
dbcolumnname, -- Spreading Column 
data -- Aggregate Column 
FROM pivot2 
) 
SELECT customerid, [firstname], [middlename], [lastname] 
FROM pivot_data 
PIVOT (max(data) FOR dbcolumnname IN ([firstname],[middlename],[lastname])) AS p; 
0

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

SELECT CUSTOMER_ID, MAX(FIRSTNAME) AS FIRSTNAME, MAX(LASTNAME) AS LASTNAME ... 

FROM 
(

SELECT CUSTOMER_ID, 
     CASE WHEN DBCOLUMNNAME='FirstName' then DATA ELSE NULL END AS FIRSTNAME, 
     CASE WHEN DBCOLUMNNAME='LastName' then DATA ELSE NULL END AS LASTNAME, 
     ... and so on ... 
GROUP BY CUSTOMER_ID 

) TEMP 

GROUP BY CUSTOMER_ID 
0

यह काम करना चाहिए:

--summarize मान:

select * from (select [CustomerID] ,[Demographic] ,[Data] 
from [dbo].[pivot] 
) as Ter 

pivot (max(Data) for Demographic in (FirstName, MiddleName, LastName, [Date]))as bro 
0

यहाँ एक शानदार तरीका एक धुरी क्वेरी के लिए गतिशील क्षेत्रों का निर्माण करना है एक टीएमपी टेबल

declare @STR varchar(1000) 
SELECT @STr = COALESCE(@STr +', ', '') 
+ QUOTENAME(DateRange) 
from (select distinct DateRange, ID from ##pivot)d order by ID 

--- दिखाई देने वाली फ़ील्ड

print @STr 

exec(' .... pivot code ... 
pivot (avg(SalesAmt) for DateRange IN (' + @Str +')) AS P 
order by Decile')