2011-08-13 12 views
56

के बीच मतभेदों को समझना मेरे असाइनमेंट ने मुझे यह जानने के लिए कहा कि "प्रत्येक तारीख के लिए कितने चालान लिखे गए हैं?"क्यूब और रोलअप

मैं थोड़ा फंस गया था और मदद के लिए मेरे प्रोफेसर से पूछा। उसने मुझे एक प्रश्न ईमेल किया जो सवाल का जवाब देगा, "प्रत्येक प्रकार और संस्करण के कितने स्टोव बनाए गए हैं? चुनौती के लिए लेकिन कोई अतिरिक्त अंक नहीं, स्टोव की कुल संख्या शामिल करें।"

SELECT STOVE.Type + STOVE.Version AS 'Type+Version' 
, COUNT(*) AS 'The Count' 
FROM STOVE 
GROUP BY STOVE.Type + STOVE.Version WITH ROLLUP; 

तो, मुझे लगता है कि क्वेरी फेरबदल जब तक यह मेरी जरूरतों को पूरा:

इस क्वेरी उसने मुझे भेजा था। यही वह है जिसके साथ मैं आया:

SELECT InvoiceDt 
, COUNT(InvoiceNbr) AS 'Number of Invoices' 
FROM INVOICE 
GROUP BY InvoiceDt WITH ROLLUP 
ORDER BY InvoiceDt ASC; 

और यह निम्नलिखित परिणाम लौटा जो मैं चाहता था।

वैसे भी, मैंने रोलअप क्लॉज पर पढ़ने का फैसला किया और Microsoft से एक लेख के साथ शुरू किया। कहा जाता है कि रोलअप खंड घन खंड के समान था लेकिन वह यह निम्नलिखित तरीके से घन खंड से प्रतिष्ठित किया गया था:

  1. घन एक परिणाम सेट है कि चयनित स्तंभ में मान के सभी संयोजनों के लिए समुच्चय से पता चलता उत्पन्न करता है।
  2. रोलअप एक परिणाम सेट उत्पन्न करता है जो चयनित कॉलम में मानों के पदानुक्रम के लिए समेकित दिखाता है।

तो, मैंने यह देखने के लिए कि क्या होगा, CUBE के साथ मेरी क्वेरी में रोलअप को प्रतिस्थापित करने का निर्णय लिया। उन्होंने एक ही परिणाम उत्पन्न किए। मुझे लगता है कि वह है जहां मैं भ्रमित हो रहा हूँ।

ऐसा लगता है कि यदि आप यहां मौजूद क्वेरी के प्रकार का उपयोग कर रहे हैं, तो दो खंडों के बीच कोई व्यावहारिक अंतर नहीं है। क्या वह सही है? या, क्या मैं कुछ समझ नहीं रहा हूँ? मैंने सोचा था, जब मैंने माइक्रोसॉफ्ट आलेख पढ़ना समाप्त कर दिया था, तो मेरे परिणाम CUBE खंड का उपयोग करके अलग होना चाहिए था।

उत्तर

130

आप कोई अंतर नहीं देखेंगे क्योंकि आप केवल एक ही कॉलम को रोल कर रहे हैं। एक उदाहरण पर विचार जहां हम करते हैं

ROLLUP (YEAR, MONTH, DAY)

एक ROLLUP के साथ, यह निम्नलिखित आउटपुट होगा:

YEAR, MONTH, DAY 
YEAR, MONTH 
YEAR 
() 
CUBE साथ

, यह निम्न होगा:

YEAR, MONTH, DAY 
YEAR, MONTH 
YEAR, DAY 
YEAR 
MONTH, DAY 
MONTH 
DAY 
() 

CUBE अनिवार्य रूप से प्रत्येक नोड के लिए प्रत्येक संभावित रोलअप परिदृश्य शामिल है जबकि ROLLUP पदानुक्रम को बरकरार रखेगा (इसलिए यह महीना नहीं छोड़ेगा और वर्ष/दिन दिखाएगा, जबकि CUBE होगा)

यही कारण है कि आपको कोई फर्क नहीं पड़ता क्योंकि आपके पास केवल एक ही स्तंभ था जो आप रोलिंग कर रहे थे ।

उम्मीद है कि मदद करता है।

+1

दिलचस्प पाने के लिए। मुझे आश्चर्य है कि क्यों डिजाइनरों ने सिर्फ एक नहीं चुना और यह कैसे व्यवहार करेगा इसके लिए एक अतिरिक्त विशेषता param जोड़ें। मूल रूप से एक ही चीज के लिए अलग-अलग नामों को टॉव करना, लेकिन थोड़ा अलग मूर्खतापूर्ण है। – user2326106

6

ऐसा इसलिए है क्योंकि आपके पास केवल एक कॉलम है जिसे आप समूहीकृत कर रहे हैं।

Group by InvoiceDt, InvoiceCountry जोड़े (या जो भी क्षेत्र आप अधिक डेटा प्राप्त होगा।

घन के साथ प्रत्येक InvoiceDt के लिए आप एक बीमा राशि दे देंगे और आप प्रत्येक InvoiceCountry के लिए एक बीमा राशि मिल जाएगा।

62

हम बीच के अंतर को समझ सकता हूँ रोलअप और एक सरल उदाहरण के साथ घन। पर विचार करें कि हम एक तालिका जो छात्रों की त्रैमासिक परीक्षण के परिणामों को शामिल किया है। कुछ मामलों में हम कुल तिमाही के साथ-साथ छात्रों के लिए इसी को देखने की जरूरत है। यहाँ नमूना तालिका

है
SELECT * INTO #TEMP 
FROM 
(
    SELECT 'Quarter 1' PERIOD,'Amar' NAME ,97 MARKS 
    UNION ALL 
    SELECT 'Quarter 1','Ram',88 
    UNION ALL 
    SELECT 'Quarter 1','Simi',76 
    UNION ALL 
    SELECT 'Quarter 2','Amar',94 
    UNION ALL 
    SELECT 'Quarter 2','Ram',82 
    UNION ALL 
    SELECT 'Quarter 2','Simi',71 
    UNION ALL 
    SELECT 'Quarter 3' ,'Amar',95 
    UNION ALL 
    SELECT 'Quarter 3','Ram',83 
    UNION ALL 
    SELECT 'Quarter 3','Simi',77 
    UNION ALL 
    SELECT 'Quarter 4' ,'Amar',91 
    UNION ALL 
    SELECT 'Quarter 4','Ram',84 
    UNION ALL 
    SELECT 'Quarter 4','Simi',79 
)TAB 

enter image description here

1. रोलअप (एक स्तंभ के लिए इसी के लिए कुल मिल सकता है)

(क) सभी तिमाहियों में प्रत्येक छात्र के कुल स्कोर प्राप्त करें।

SELECT * FROM #TEMP 
UNION ALL 
SELECT PERIOD,NAME,SUM(MARKS) TOTAL 
FROM #TEMP 
GROUP BY NAME,PERIOD 
WITH ROLLUP 
HAVING PERIOD IS NULL AND NAME IS NOT NULL 
// Having is used inorder to emit a row that is the total of all totals of each student 

के बाद का परिणाम है (एक)

enter image description here

(ख) यदि आपके का नतीजा है प्रत्येक तिमाही

SELECT * FROM #TEMP 
UNION ALL 
SELECT PERIOD,NAME,SUM(MARKS) TOTAL 
FROM #TEMP 
GROUP BY PERIOD,NAME 
WITH ROLLUP 
HAVING PERIOD IS NOT NULL AND NAME IS NULL 

के बाद की कुल अंक प्राप्त करने होंगे (ख)

enter image description here

2. घन (एक शॉट में तिमाही के लिए कुल और साथ ही छात्रों का पता लगाएं)

SELECT PERIOD,NAME,SUM(MARKS) TOTAL 
FROM #TEMP 
GROUP BY NAME,PERIOD 
WITH CUBE 
HAVING PERIOD IS NOT NULL OR NAME IS NOT NULL 

बाद CUBE

enter image description here

अब आप के बारे में सोच किया जा सकता है का परिणाम है रोलअप और क्यूब का वास्तविक समय उपयोग। कभी कभी हम एक रिपोर्ट है जिसमें हम एक शॉट में प्रत्येक तिमाही और प्रत्येक छात्र के कुल की कुल देखने की जरूरत की जरूरत है। यहाँ एक उदाहरण

मैं ऊपर घन क्वेरी थोड़ा बदल रहा हूँ के रूप में हम दोनों योग के लिए कुल जरूरत है।

SELECT CASE WHEN PERIOD IS NULL THEN 'TOTAL' ELSE PERIOD END PERIOD, 
CASE WHEN NAME IS NULL THEN 'TOTAL' ELSE NAME END NAME, 
SUM(MARKS) MARKS 
INTO #TEMP2 
FROM #TEMP 
GROUP BY NAME,PERIOD 
WITH CUBE 

DECLARE @cols NVARCHAR (MAX) 

SELECT @cols = COALESCE (@cols + ',[' + PERIOD + ']', 
       '[' + PERIOD + ']') 
       FROM (SELECT DISTINCT PERIOD FROM #TEMP2) PV 
       ORDER BY PERIOD  


DECLARE @query NVARCHAR(MAX) 
SET @query = 'SELECT * FROM 
      (
       SELECT * FROM #TEMP2 
      ) x 
      PIVOT 
      (
       SUM(MARKS) 
       FOR [PERIOD] IN (' + @cols + ') 
      ) p;' 

EXEC SP_EXECUTESQL @query 

अब आप निम्न परिणाम

enter image description here

1

आप ग्रुपिंग सेट, घन, रोल उत्तर प्रदेश के बारे में और अधिक विस्तार पा सकते हैं मिल जाएगा। टी एल; डॉ वे सिर्फ ग्रुप द्वारा + यूनिअन सभी का विस्तार कुछ मायनों में एकत्रीकरण :)

https://technet.microsoft.com/en-us/library/bb510427(v=sql.105).aspx

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