2010-12-29 17 views
8

मेरे पास एक सारणी है जिसमें कुंजी-मान के आधार पर विशेषताएँ हैं। उदाहरण:कुंजी-मान तालिका पर SQL सर्वर PIVOT

CREATE TABLE ObjectAttributes 
(
    int objectId, key nvarchar(64), value nvarchar(512) 
) 

जब मैं इस से चयन मैं:

objectId key  value 
---------------------------- 
1   Key 1 Value 1 
1   Key 2 Value 2 

अगर मैं में इस बारी करने के धुरी वाक्य रचना इस्तेमाल कर सकते हैं मैं सोच रहा था:

objectId Key 1  Key 2 
--------------------------- 
1   Value 1 Value 2 

मैं की सभी जानते हैं मेरी टेबल में एक ही कुंजी होगी। (दुर्भाग्यवश मैं टेबल संरचना को आसानी से नहीं बदल सकता। यही कारण है कि मुझे PIVOTS का उपयोग करने का प्रयास करने के लिए अग्रणी है)।

हालांकि यहां बड़ी समस्या यह है कि पिवोट्स को एकत्रीकरण फ़ंक्शन की आवश्यकता होती है। क्या इसे रोकने का कोई तरीका है? क्या मैं पूरी कोशिश कर रहा हूं? या क्या कोई बेहतर समाधान है?

+0

क्या आप निश्चित कॉलम आउटपुट चाहते हैं? यही है, आप दिए गए ऑब्जेक्ट के लिए सभी चाबियाँ पिट करना चाहते हैं? – gbn

उत्तर

7

एक पिवट कोई तेज़ नहीं होगा, फिर एक निश्चित कॉलम आउटपुट के लिए दो बार स्वयं जुड़ जाएगा।

SELECT 
    T1.objectID, T1.Value AS Key1, T2.Value AS Key2 
FROM 
    ObjectAttributes T1 
    JOIN 
    ObjectAttributes T2 ON T1.objectID = T2.objectID 
WHERE 
    T1.key = 'Key 1' 
    AND 
    T2.key = 'Key 2' 

यदि आप PIVOT का उपयोग करना चाहते हैं, तो बस MAX का उपयोग करें। चूंकि आपके पास प्रति ऑब्जेक्ट/कुंजी एक पंक्ति है, वैसे भी यह मामूली है और PIVOT आवश्यकता को पूरा करने के लिए वहां है।

यदि आप अज्ञात कॉलम में पंक्तियों की संख्या PIVOT करना चाहते हैं, तो यह गतिशील SQL (SQL Server 2000 समाधान के अनुसार) है या इसे क्लाइंट कोड में करें।

यदि प्रत्येक ऑब्जेक्ट में निश्चित संख्या में गुण होते हैं तो मैं एक ट्रिगर द्वारा बनाए गए वास्तविक कॉलम के साथ दूसरी तालिका रखने पर विचार करता हूं। बेकार, लेकिन

+0

आह ठीक है। मैं मान रहा था कि पिवट टेबल के पीछे कुछ प्रकार का जादू था जिसने इसे तेज बना दिया। मैं सिर्फ मार्ग में शामिल होने के साथ जाऊंगा। – Kyle

+0

आप इस समाधान के लिए बाहरी जॉइन का उपयोग करना चाह सकते हैं। यदि आप एक कुंजी खो रहे हैं तो आउटपुट ऑब्जेक्ट आईडी की पूरी पंक्ति यहां इस्तेमाल किए गए आंतरिक जुड़ने के साथ गायब हो जाएगी। –

+0

@ सर वोबिन: और फ़िल्टर को जॉइन में भी ले जाएं ... – gbn

5

पढ़ने के लिए जीवन आसान बनाता है, नहीं, आप कुल से बच नहीं सकते हैं। SQL सर्वर को कई संभावित पंक्तियों को एक मान में संयोजित करने के कुछ तरीके की आवश्यकता है। आपके पास एक मान होता है लेकिन PIVOT कार्यक्षमता कई पंक्तियों के साथ बनाई जाती है।

SELECT objectId, [Key 1], [Key 2] 
FROM 
(SELECT objectId, [key], value FROM ObjectAttributes) AS source 
PIVOT 
(
MIN(value) 
FOR [key] IN ([Key 1], [Key 2]) 
) as pvt 
संबंधित मुद्दे