sql - कुल समारोह के बिना टीएसक्यूएल पिवट




sql-server tsql (6)

मेरे पास इस तरह की एक टेबल है ...

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

और मुझे यह चाहिए ...

क्या यह PIVOT का उपयोग कर संभव है?

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

https://code.i-harness.com


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

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


इसे इस्तेमाल करे:

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

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

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

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

इस तरह कुछ का उपयोग करना

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 बनाने के लिए और तालिका से अलग कॉलम नामों का चयन करें। उत्तर के लिए धन्यवाद।


पिवट क्वेरी के लिए गतिशील फ़ील्ड बनाने का एक शानदार तरीका यहां दिया गया है:

- एक tmp तालिका में मूल्यों को समेकित करें

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

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

   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

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' 

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







pivot-without-aggregate