2012-06-07 20 views
5

द्वारा मेरे पास निम्न क्वेरीएसक्यूएल सर्वर समूह

select 
    datepart(yy, orderDate) as 'year', 
    datename(mm, OrderDate) as 'month', 
    count(*) as 'Orders' 
from orders  (yeah I know its missing the schema, its from a book) 
group by 
    datepart(yy, orderdate), 
    datename(mm, orderdate) 
order by 
    datepart(yy, orderdate), 
    datename(mm, orderdate); 

जो 3 कॉलम रिटर्न लेकिन एक स्ट्रिंग datename(mm, orderdate) देता है और इसलिए यह द्वारा आदेश देने जनवरी आदि

इस का हल पहले अगस्त डालता है निम्नलिखित था:

select 
    datepart(yy, orderDate) as 'year', 
    datename(mm, OrderDate) as 'month', 
    count(*) as 'Orders' 
from orders (yeah i know its missing the schema, its from a book) 
group by 
    datepart(yy, orderdate), 
    datename(mm, orderdate), 
    datepart(mm, orderdate) 
order by 
    datepart(yy, orderdate), 
    datepart(mm, orderdate); 

मैं अभी भी पूरे समूह के साथ अनुभागों द्वारा/क्रम में थोड़ा उलझन में हूं और यह वास्तव में कैसे काम करता है।

जहां तक ​​मुझे समझा गया है, समूह 4 कॉलम (जो गलत हो सकता है) के साथ एक कार्य तालिका बना रहा है datepart(yy, orderdate), datename(mm, orderdate), datepart(mm, orderdate), और count कॉलम।

हर बार यह orderdate से मुकाबला करता है कि यह कार्य तालिका में है, यह गिनती बढ़ता है, अन्यथा यह एक नई पंक्ति जोड़ता है?

मूल रूप से मैंने सोचा कि मैं समूह के भीतर से DateName(mm, orderdate) को हटा सकता हूं लेकिन पुस्तक ने कहा कि यह संभव नहीं है।

यदि कोई व्यक्ति वास्तव में दृश्यों के पीछे क्या होता है/एक संसाधन बताता है जो बताता है कि यह थोड़ा और विस्तार आईडी में कैसे काम करता है, तो इसकी सराहना करते हैं।

आपकी सहायता के लिए धन्यवाद।

+0

आपका प्रश्न वास्तव में क्या है? क्या आप सिर्फ एक स्पष्टीकरण की तलाश कर रहे हैं कि आपकी क्वेरी कैसे काम कर रही है? –

+0

मैं इस बात के बारे में उलझन में हूं कि यह कैसे काम करता है और मूल रूप से मैंने सोचा कि मैं समूह से दिनांक से हटा सकता हूं। –

+0

'ऑर्डरडेट द्वारा ऑर्डर' काम नहीं करता है? या 'ऑर्डर' खंड में 'डेटनाम 'की बजाय' datepart' का उपयोग कर रहे हैं? – HABO

उत्तर

7

जब भी आप एक समग्र फ़ंक्शन (COUNT, SUM, MAX, आदि) का उपयोग करते हैं तो आपको ग्रुप बाय क्लॉज में अन्य सभी कॉलम शामिल करने की आवश्यकता होती है। आपके उदाहरण में COUNT datepart(yy, orderdate), datename(mm, orderdate), datepart(mm, orderdate) के लिए समान मान वाले रिकॉर्ड की संख्या लौटा रहा है।

एक उदाहरण:

1,2,3,9 
1,2,5,9 

आप इस के लिए आपकी क्वेरी परिवर्तित हुआ है:

SELECT col1, col2, col3, MAX(col4) 
FROM MyTable 
GROUP BY col1, col2, col3 

इस लौटे कहो

SELECT col1, col2, MIN(col3), MAX(col4) 
FROM MyTable 
GROUP BY col1, col2 

यह वापसी होगी:

1,2,3,9 

ध्यान दें कि मैंने col3 (MIN) में एक समग्र फ़ंक्शन जोड़ा है, इसलिए मैं अपने ग्रुप बाय क्लॉज से col3 को हटाने में सक्षम था।

+0

तो कार्य तालिका में 4 कॉलम सही हैं? –

+0

यह वास्तव में कोई फर्क नहीं पड़ता कि तालिका में कितने कॉलम हैं, यह महत्वपूर्ण है कि आप कितने चयन कर रहे हैं और उनमें से कितने चयनित कॉलम के लिए एक समग्र कार्य किया गया है। –

+0

एक आखिरी सवाल, अगर मैंने चयन कथन से गिनती (*) हटा दी है, तो मुझे केवल 2 कॉलम लौटाएंगे, और उन्हें आदेश दिया जाएगा क्योंकि वे सही थे? (मुझे लगता है कि मुझे इसके बजाय अलग() का उपयोग करना चाहिए)। –

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