समूह द्वारा लौटाए गए रिकॉर्डों की गिनती


138

मैं एक समूह द्वारा क्वेरी द्वारा लौटाए गए रिकॉर्ड की संख्या कैसे गिनूं,

उदाहरण के लिए:

select count(*) 
from temptable
group by column_1, column_2, column_3, column_4

मुझे देता है,

1
1
2

मुझे 1 + 1 + 1 = 3 प्राप्त करने के लिए उपरोक्त रिकॉर्डों को गिनने की आवश्यकता है।


3
@ लॉरेंस: लेकिन इससे मुझे तालिका में रिकॉर्ड की संख्या का पता चल जाएगा। मुझे समूह के बाद रिकॉर्ड की संख्या चाहिए।
क्रिस

3
हालांकि समूह पंक्तियों की संख्या में परिवर्तन नहीं करता है। 1 + 1 + 2 (आपके उदाहरण में) तालिका में पंक्तियों की संख्या होगी। आप 3 की तलाश कर रहे हैं? अलग-अलग समूहों की संख्या?
लोरेनव्स

2
प्रश्न तैयार करने का दूसरा तरीका: मैं किसी प्रश्न के लिए अलग-अलग समूहीकरण स्तरों की संख्या का चयन कैसे करूं?
जूलियन

यह हमेशा स्पष्ट नहीं होता है कि कोई उपयोगकर्ता एक प्रश्न क्यों पूछता है, लेकिन मैं यहां इसलिए आया क्योंकि मैं परीक्षण कर रहा हूं कि क्या एक दृश्य में एक स्तंभ एक उम्मीदवार प्राथमिक कुंजी या संयोजन कुंजी है। "VIEWNAME से गिनती (अलग COLUMNNAME) का चयन करें" बार, जहां समूह काम करता है अगर मुझे कुल मिल सकता है।
केन फोर्सलंड

जवाबों:


169

आप किसी अन्य COUNT पर OVER क्लॉज़ का उपयोग करके एक क्वेरी में दोनों कर सकते हैं

select
    count(*) RecordsPerGroup,
    COUNT(*) OVER () AS TotalRecords
from temptable
group by column_1, column_2, column_3, column_4

मुझे पता है कि यह एक SQL- सर्वर प्रश्न है, लेकिन संदर्भ के लिए: यह DB / 2 (आईबीएम iSeries पर मेरे मामले में) पर काम नहीं करता है। थॉमस की जवाब में मेरी टिप्पणी देखें
बिनजिन

मैं उस संख्या को कैसे गूँजूँगा?
मैकडान गैरेट

1
इस समाधान का यह नीचे पक्ष है कि यह आपको कई बार (प्रत्येक संयोजन के लिए column_1, column_2, column_3, column_4) उत्तर देता है । आप परिणामों को कैसे संसाधित करते हैं, इसके आधार पर यह एक महत्वपूर्ण दुष्प्रभाव नहीं हो सकता है या नहीं भी हो सकता है।
कार्टबेफ्रोरसे

3
केवल रिकॉर्ड की संख्या वापस करने के लिए, एक शीर्ष (1) गिनती (*) ओवर () के रूप में जोड़ें ....
Guilherme Campos Hazan

2
मेरे मामले में TOP (1) COUNT ( ) OVER () का उपयोग खराब क्वेरी प्रदर्शन था। चूँकि मुझे केवल उन समूहों की गिनती की आवश्यकता थी जिन्हें मैंने इसे DISTINCT COUNT ( ) OVER (), और क्वेरी प्रदर्शन में नाटकीय रूप से परिवर्तित किया
जो एल्ड्रिच

71

सबसे सरल उपाय एक व्युत्पन्न तालिका का उपयोग करना है:

Select Count(*)
From    (
        Select ...
        From TempTable
        Group By column_1, column_2, column_3, column_4
        ) As Z

एक और उपाय एक गिनती भेद का उपयोग करना है:

Select ...
    , ( Select Count( Distinct column_1, column_2, column_3, column_4 )
        From TempTable ) As CountOfItems
From TempTable
Group By column_1, column_2, column_3, column_4

पहला उत्तर भी DB / 2 पर काम करता है, लेकिन किसी कारण से इसे TMP के रूप में काम करने के लिए अतिरिक्त (ट्राउटिनेटर जोड़ा गया) की आवश्यकता होती है
Bjinse

5
@Bjinse - कुछ DBMS की आवश्यकता होगी कि सभी व्युत्पन्न तालिकाओं में एक उपनाम हो। वे सभी इसे स्वीकार करेंगे इसलिए इसे शामिल करने के लिए चोट नहीं पहुंचेगी। मैं इसे अपने जवाब में जोड़ दूंगा।
थॉमस

25

मुझे पता है कि यह देर हो चुकी है, लेकिन किसी ने यह सुझाव नहीं दिया है:

select count ( distinct column_1, column_2, column_3, column_4) 
from   temptable

यह कम से कम ओरेकल में काम करता है - मेरे पास वर्तमान में इसका परीक्षण करने के लिए अन्य डेटाबेस नहीं हैं, और मैं टी-सक्ल और मायएसक्यूएल सिंटैक्स से परिचित नहीं हूं।

इसके अलावा, मुझे पूरी तरह से यकीन नहीं है कि क्या यह इस तरह से करने के लिए पार्सर में अधिक कुशल है, या क्या बाकी के बयान का चयन करने के लिए हर किसी का समाधान बेहतर है। लेकिन मुझे लगता है कि यह एक कोडिंग दृष्टिकोण से अधिक सुरुचिपूर्ण है।


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

@ RăzvanFlaviusPanda 1. क्यों? अन्य समाधानों के बारे में क्या अच्छा है? नेस्टिंग SQL अधिक क्रियात्मक है और मेरी नज़र में, अधिक गन्दा और समझने में कठिन है (एक समर्थन अर्थ में बनाए रखने के लिए कठिन है)। मुझे लगता है कि आपके पास अन्य तरीकों के लिए प्राथमिकता हो सकती है, लेकिन यह किसी और की पसंद पर "अनुशंसा" करने का कारण नहीं है। थॉमस ने एक समान सुझाव दिया, हां, लेकिन फिर से वह इसे देखता है जैसे कि एसक्यूएल घोंसले के समाधान का एक आवश्यक हिस्सा है, जो यह नहीं है।
कार्टबेफोरस

12

मैं बिना सबक्वेरी के समान हासिल करने की कोशिश कर रहा था और नीचे दिए गए आवश्यक परिणाम प्राप्त करने में सक्षम था

SELECT DISTINCT COUNT(*) OVER () AS TotalRecords
FROM temptable
GROUP BY column_1, column_2, column_3, column_4


3

कैसा रहेगा:

SELECT count(column_1)
FROM
    (SELECT * FROM temptable
    GROUP BY column_1, column_2, column_3, column_4) AS Records

1

तुम यह कर सकते थे:

select sum(counts) total_records from (
    select count(*) as counts
    from temptable
    group by column_1, column_2, column_3, column_4
) as tmp

1

PostgreSQL में यह मेरे लिए काम करता है:

select count(count.counts) 
from 
    (select count(*) as counts 
     from table 
     group by concept) as count;

1

क्या आप नीचे दिए गए कोड को निष्पादित कर सकते हैं। यह ओरेकल में काम करता था।

SELECT COUNT(COUNT(*))
FROM temptable
GROUP BY column_1, column_2, column_3, column_4

1
SQL- सर्वर पर एक कुल के अंदर कुल नहीं चला सकते।
ए। ग्रीनस्मिथ

0

आप नीचे दिए गए क्वेरी द्वारा भी प्राप्त कर सकते हैं

select column_group_by,count(*) as Coulm_name_to_be_displayed from Table group by Column;

-- For example:
select city,count(*) AS Count from people group by city


0

निम्नलिखित PrestoDb , FirstField अधिक मान सकते हैं, जहां:

select *
            , concat(cast(cast((ThirdTable.Total_Records_in_Group * 100 / ThirdTable.Total_Records_in_baseTable) as DECIMAL(5,2)) as varchar), '%') PERCENTage
from 
(
    SELECT FirstTable.FirstField, FirstTable.SecondField, SecondTable.Total_Records_in_baseTable, count(*) Total_Records_in_Group
    FROM BaseTable FirstTable
    JOIN (
            SELECT FK1, count(*) AS Total_Records_in_baseTable 
            FROM BaseTable
            GROUP BY FK1
        ) SecondTable
    ON FirstTable.FirstField = SecondTable.FK1
    GROUP BY FirstTable.FirstField, FirstTable.SecondField, SecondTable.Total_Records_in_baseTable
    ORDER BY FirstTable.FirstField, FirstTable.SecondField
) ThirdTable

-1

SQL सर्वर में पार्टीशनिंग फंक्शन (विभाजन द्वारा {कॉलम बाय ग्रुप टू}) का उपयोग कैसे करें?

उदाहरण के लिए, यदि आप ItemID द्वारा उत्पाद की बिक्री का समूह बनाना चाहते हैं और आप प्रत्येक विशिष्ट ItemID की एक गिनती चाहते हैं, तो बस उपयोग करें:

SELECT
{columns you want} ,
COUNT(ItemID) OVER (PARTITION BY ItemID) as BandedItemCount ,
{more columns you want}... ,
FROM {MyTable}

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


क्या मूल्य BandedItemCountबिल्कुल शामिल होंगे ? क्या यह आउटपुट पंक्तियों के बीच भिन्न होता है? पूछने वाला अलग-अलग समूह स्तरों की संख्या की तलाश में है।
जूलियन
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.