2011-07-06 11 views
11

मैं SQL सर्वर में group by's के साथ स्ट्रिंग को जोड़ने के लिए उपयोगकर्ता परिभाषित कुल बनाने के लिए this MSDN page से कोड का उपयोग कर रहा हूं। मेरी आवश्यकताओं में से एक यह है कि समेकित मूल्यों का क्रम क्वेरी में जैसा ही है। उदाहरण के लिए:एसक्यूएल उपयोगकर्ता संरक्षित मूल्यों के कुल क्रम परिभाषित?

Value Group 
1  1 
2  1 
3  2 
4  2 

का उपयोग करना क्वेरी

SELECT 
    dbo.Concat(tbl.Value) As Concat, 
    tbl.Group 
FROM 
    (SELECT TOP 1000 
    tblTest.* 
    FROM 
    tblTest 
    ORDER BY 
    tblTest.Value) As tbl 
GROUP BY 
    tbl.Group 

परिणाम होगा में:

Concat Group 
"1,2" 1 
"3,4" 2 

परिणाम हमेशा सही बाहर आने के लिए और अपेक्षा के अनुरूप लगता है, लेकिन की तुलना में मैं this page में आए जो यह बताता है कि आदेश की गारंटी नहीं है और यह विशेषता SqlUserDefinedAggregateAttribute.IsInvariantToOrder केवल भविष्य के उपयोग के लिए आरक्षित है।

तो मेरा सवाल यह है: क्या यह मानना ​​सही है कि स्ट्रिंग में समेकित मान किसी भी क्रम में समाप्त हो सकते हैं?
यदि ऐसा है तो एमएसडीएन पृष्ठ पर उदाहरण कोड IsInvariantToOrder विशेषता का उपयोग क्यों करता है?

+0

अपने एमएस सवाल का जवाब नहीं कर सकते, लेकिन 'GROUP_CONCAT' आप संयोजन के बारे में नियतात्मक हो सकते हैं। –

+0

@kerrek - ध्यान दें कि यह 'एसक्यूएल सर्वर' नहीं है 'MySQL' – JNK

+0

मुझे डर है कि SQL सर्वर 2008 – Magnus

उत्तर

5

मुझे लगता है एक बड़ी समस्या यहाँ बयान "क्वेरी में के रूप में ही है" - हालांकि, आपकी क्वेरी कभी नहीं परिभाषित करता है (और परिभाषित नहीं कर सकते हैं) बातों से एक आदेश से समेकित किया जाने (आप इस पाठ्यक्रम के आदेश के कर सकते हैं समूह, GROUP BY के बाद)। इसके अलावा, मैं केवल इतना कह सकता हूं कि यह पूरी तरह से (क्रमबद्ध अनुक्रम के बजाए) पर आधारित है, और तकनीकी रूप से आदेश वास्तव में अपरिभाषित है।

+0

+1 - एसओ पर 'एसक्यूएल ऑर्डर' के लिए खोजें और आपको इसी तरह के मुद्दों के बारे में बहुत सारी पोस्ट मिलेंगी। – JNK

+0

यदि आप आंतरिक चयन के समूह के शीर्ष पर और उस समूह के ऊपर 'शीर्ष' कथन रखते हैं तो आप 'ऑर्डर बाय' निर्दिष्ट कर सकते हैं। – Magnus

+0

@Marc मैंने अपने प्रश्न को एक प्रश्न के साथ अद्यतन किया है जो 'शीर्ष' कथन और 'ऑर्डर बाय' के साथ आंतरिक चयन का उपयोग कर रहा है। समूह का उपयोग करने के अंतिम परिणाम और 'कंसट' पर अभी भी एक अनिर्धारित आदेश होगा? – Magnus

1

जबकि स्वीकृत उत्तर सही है, मैं एक वर्कअराउंड साझा करना चाहता था जो दूसरों को उपयोगी लगे। चेतावनी: इसमें उपयोगकर्ता द्वारा परिभाषित कुल का उपयोग नहीं करना शामिल है :)

नीचे दिया गया लिंक केवल एक चयन कथन और एक वर्चर चर का उपयोग करके एक समेकित, सीमांकित सूची बनाने के लिए एक शानदार तरीका का वर्णन करता है। उल्टा (इस धागे के लिए) यह है कि आप उस क्रम को निर्दिष्ट कर सकते हैं जिसमें पंक्तियां संसाधित की जाती हैं। नकारात्मकता यह है कि आप दर्दनाक पुनरावृत्ति के बिना पंक्तियों के कई अलग-अलग सबसेटों में आसानी से संयोजित नहीं कर सकते हैं।

सही नहीं है, लेकिन मेरे उपयोग के मामले के लिए एक अच्छा कामकाज था।

http://blog.sqlauthority.com/2008/06/04/sql-server-create-a-comma-delimited-list-using-select-clause-from-table-column/

+0

हालांकि मेरे समूह में एक समूह के साथ इसका उपयोग नहीं किया जा सकता है। – Magnus

+0

हाँ, बिल्कुल - यही वह था जो मैं कह रहा था कि "नकारात्मकता यह है ..." –

+0

इस मामले में आप एक आदेश कैसे निर्दिष्ट करेंगे? यदि यह किसी दृश्य या फ़ंक्शन के अंदर है, तो यह बेकार बनाने के लिए आदेश निर्दिष्ट करना अभी भी असंभव है। –

संबंधित मुद्दे