2012-08-16 13 views
5

मेरे पास SQL ​​Server 2008 में प्रश्नावली डेटा है, जिसे मैं मैट्रिक्स में स्थानांतरित करना चाहता हूं।
मैंने एक ही विषय के बारे में कई पोस्ट देखी, लेकिन मुझे सिर्फ पिवोटिंग नहीं मिल रही है।पिवोट डायनामिक कॉलम, कोई एकत्रीकरण

को देखते हुए हैं निम्न तालिकाओं:

Question table

Answer table

Customer table

कॉलम:
[CustomerID], [QuestionName_1], .., [QuestionName_n] < - गतिशील सवाल स्तंभों की संख्या)
डेटा:
CustomerID, Answer_1, .., Answer_n

कोड स्तंभों को पुनः प्राप्त करने:

DECLARE @columns VARCHAR(8000) 

SELECT @columns = COALESCE(@columns + ',[' + cast(QuestionName as varchar) + ']', 
'[' + cast(QuestionName as varchar)+ ']') 
FROM Answer A 
INNER JOIN Question Q ON A.QuestionID = Q.QuestionID 
INNER JOIN Customer C ON A.CustomerID = C.CustomerID 
GROUP BY Q.QuestionName 

SET @columns = '[CustomerID],' + @columns 

DECLARE @query VARCHAR(8000) 
SET @query = 'Some PIVOT query without aggregation' 

EXECUTE(@query) 

प्रारंभिक क्वेरी विचार से लिया गया है pivots with dynamic columns

क्या यह किया जा सकता है और पिवोटिंग क्वेरी कैसा दिखाई देगी?
ps: मैं अधिकतम कॉलम के साथ रैंकिंग का उपयोग नहीं करना चाहता हूं।

सादर,

मिशेल

उत्तर

15

हाँ, आप एक गतिशील धुरी प्रदर्शन कर सकते हैं। कभी-कभी स्थिर संस्करण का उपयोग करके PIVOT क्वेरी को काम करना आसान होता है ताकि आप देख सकें कि क्वेरी और परिणाम कैसा दिखाई देंगे। फिर क्वेरी को गतिशील संस्करण में बदलें।

select * 
from 
(
    select u.userid, 
     u.fname, 
     u.lname, 
     u.mobile, 
     r.question, 
     r.choice 
    from users u 
    left join results r 
     on u.questionid = r.questionid 
     and u.choiceid = r.choiceid 
) x 
pivot 
(
    min(choice) 
    for question in([are you], [from]) 
) p 

गतिशील (SQL Fiddle):

स्थिर (SQL Fiddle):

यहाँ एक प्रश्न के एक स्थिर बनाम गतिशील संस्करण का एक उदाहरण है

DECLARE @cols AS NVARCHAR(MAX), 
    @query AS NVARCHAR(MAX) 

SET @cols = STUFF((SELECT distinct ',' + QUOTENAME(c.question) 
      FROM results c 
      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 

set @query = 'SELECT userid, fname, lname, mobile, ' + @cols + ' from 
      (
       select u.userid, 
        u.fname, 
        u.lname, 
        u.mobile, 
        r.question, 
        r.choice 
       from users u 
       left join results r 
        on u.questionid = r.questionid 
        and u.choiceid = r.choiceid 
      ) x 
      pivot 
      (
       min(choice) 
       for question in (' + @cols + ') 
      ) p ' 


execute(@query) 

आप कर सकते हैं, तो अपनी वर्तमान तालिका संरचना और फिर कुछ नमूना डेटा के आसपास अधिक जानकारी प्रदान करें। हमें आपकी स्थिति के लिए आवश्यक संस्करण बनाने में आपकी सहायता करने में सक्षम होना चाहिए।

जैसा कि मैंने कहा था, कभी-कभी स्थिर संस्करण के साथ शुरू करना आसान होता है, जहां आप पहले कॉल करने के लिए आवश्यक कॉलम में हार्ड-कोड करते हैं, फिर गतिशील संस्करण पर जाएं।

+0

आपके उदाहरण में, 'पसंद' फ़ील्ड में डेटाटाइप क्या है? मेरे पास एक वर्चर फ़ील्ड है जिसमें प्रश्न का उत्तर शामिल है। –

+0

यदि आप एसक्यूएल फिडल देखते हैं तो यह एक 'वर्कर' है, यह तालिका संरचना दिखाएगा। – Taryn

+0

मुझे यह मिल गया है, MIN (QuestionName) के साथ। मैं इसकी उम्मीद नहीं कर रहा था! आपकी मदद के लिए धन्यवाद ब्लू :)। –