2010-01-31 13 views
11

मैं एक मेज है कि इस तरह दिखता है:परिणामी कॉलम नामों को जानने के बिना SQL सर्वर पिवट कर सकते हैं?

Month  Site   Val 
2009-12 Microsoft  10 
2009-11 Microsoft  12 
2009-10 Microsoft  13 
2009-12 Google   20 
2009-11 Google   21 
2009-10 Google   22 

और मैं एक 2-आयाम तालिका है कि प्रत्येक साइट के महीने के लिए मुझे देता है "वैल", की तरह प्राप्त करना चाहते हैं:

Month  Microsoft  Google 
2009-12  10   20 
2009-11  12   21 
2009-10  13   22 

लेकिन पकड़ है, मैं उन सभी संभावित मानों को नहीं जानता जो "साइट" में हो सकते हैं। यदि कोई नई साइट दिखाई देती है, तो मैं अपनी परिणामी तालिका में स्वचालित रूप से एक नया कॉलम प्राप्त करना चाहता हूं।

सभी कोड नमूने मैंने देखा कि ऐसा करने के लिए मुझे क्वेरी टेक्स्ट में "माइक्रोसॉफ्ट और Google" हार्डकोड करने की आवश्यकता थी।
I saw one that didn't, लेकिन यह मूल रूप से साइट्स को सूचीबद्ध करके और फ्लाई पर एक क्वेरी उत्पन्न कर रहा था (एक स्ट्रिंग को जोड़कर) जिसमें उस कॉलम नाम थे।

क्या ऐसा कोई हैक के बिना SQL Server 2008 को ऐसा करने का कोई तरीका नहीं है?

नोट: मुझे इसे एक क्वेरी के रूप में चलाने में सक्षम होना चाहिए जिसे मैं एएसपी.Net से भेजता हूं, मैं संग्रहीत प्रक्रियाओं या अन्य सामान नहीं कर सकता।

धन्यवाद!
डैनियल

+0

क्या आप 'exec (@sql)' का उपयोग करके रन टाइम पर क्वेरी निष्पादित करके संभवतः देखना चाहिए [देखें] (http://stackoverflow.com/questions/15752112/)। – surfmuggle

उत्तर

6

उदाहरण जो आपने डायनामिक एसक्यूएल का उपयोग करने के लिए लिंक किया है। दुर्भाग्यवश, आउटपुट कॉलम अग्रिम में ज्ञात नहीं होने पर SQL सर्वर में पिवोटिंग के लिए कोई अन्य अंतर्निहित विधि नहीं है।

यदि डेटा बहुत बड़ा नहीं है, तो बस एएसपी.NET से सामान्य पंक्ति क्वेरी चलाने और एप्लिकेशन कोड में अपना पिवोट करने के लिए शायद सबसे आसान है। यदि डेटा बहुत बड़ा है, तो संभव कॉलम मानों के लिए पहले पूछताछ के बाद आपको SQL गतिशील रूप से जेनरेट करना होगा।

ध्यान दें कि आपको वास्तव में एक SQL कथन लिखने की आवश्यकता नहीं है जो गतिशील एसक्यूएल उत्पन्न करता है; आप बस एएसपी.NET में एसक्यूएल उत्पन्न कर सकते हैं, और यह अधिकतर अधिक आसान होगा। जेनरेट की गई क्वेरी में उन्हें चकित करने से पहले अलग Site मानों से बचने के लिए मत भूलना, और एसक्यूएल कथन के जो भी हिस्सों को सामान्य रूप से पिवॉट के बिना आप पैरामीटर को पैरामीटर करना न भूलें।

-1

चयन महीने, मिनट (मामले साइट जब 'microsoft'then वैल अंत) माइक्रोसॉफ्ट, मिनट (मामले साइट जब' वैल अंत google'then) से गूगल समूह withoutpivot महीने से

select main.month, 
m.val as microsoft, 
g.val as google 
from withoutpivot main 
inner join withoutpivot m on m.month=main.month 
inner join withoutpivot g on g.month=main.month 
where m.site='microsoft' 
and g.site='google' 
संबंधित मुद्दे