Tarafından grup tarafından döndürülen kayıt sayısını sayma


138

Bir grubun sorguya göre döndürdüğü kayıt sayısını nasıl sayabilirim,

Örneğin:

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

Bana verir,

1
1
2

1 + 1 + 1 = 3 elde etmek için yukarıdaki kayıtları saymam gerekiyor.


3
@LorenVS: Ama bu bana tablodaki kayıtların sayısını verir. Grup olduktan sonra kayıt sayısına ihtiyacım var.
Chris

3
Bununla birlikte grup, satır sayısını değiştirmez. 1 + 1 + 2 (örneğinizde) tablodaki satır sayısı olacaktır. 3 tane mi arıyorsunuz? Farklı grupların sayısı?
LorenVS

2
Soruyu formüle etmenin başka bir yolu: belirli bir sorgu için ayrı gruplama düzeylerinin sayısını nasıl seçerim?
Julian

Bir kullanıcının neden bir soru sorduğu her zaman açık değildir, ancak buraya geldim çünkü bir görünümdeki bir sütunun aday birincil anahtar mı yoksa kombinasyon anahtarı mı olduğunu test ediyorum. "VIEWNAME adından sayımı (farklı COLUMNNAME) seçin" zaman aşımına uğradı, toplam alabilirsem grupla çalışır.
Ken Forslund

Yanıtlar:


170

Her ikisini de başka bir COUNT öğesinde OVER yan tümcesini kullanarak bir sorguda yapabilirsiniz

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

Bu bir SQL Server sorusu olduğunu biliyorum, ancak başvuru için: Bu DB / 2 (benim durumumda IBM iSeries) üzerinde çalışmaz. Thomas'ın cevabı
Bjinse

Sayılan sayıyı nasıl yankılarım?
McDan Garrett

1
Bu çözümün bu aşağı tarafı size cevabı birçok kez (her bir kombinasyonu için column_1, column_2, column_3, column_4) cevap vermesidir . Sonuçları nasıl işlediğinize bağlı olarak, bu önemli bir yan etki olabilir veya olmayabilir.
cartbeforehorse

3
Yalnızca kayıt sayısını döndürmek için, () üzerinden .... () olarak seçili bir üst (1) sayımı ekleyin.
Guilherme Campos Hazan

2
Benim durumumda TOP (1) COUNT ( ) OVER () kullanarak sorgu performansı düşüktü. Sadece grup sayısına ihtiyacım olduğundan bunu DISTINCT COUNT ( ) OVER () olarak değiştirdim ve sorgu performansı önemli ölçüde iyileşti.
Joe Aldrich

71

En basit çözüm türetilmiş bir tablo kullanmaktır:

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

Başka bir çözüm, Sayım Ayrımı kullanmaktır:

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

İlk cevap DB / 2'de de çalışır, ancak bir nedenden dolayı çalışmak için AS TMP eklenmesine ihtiyaç duyuyor (troutinator eklendi gibi)
Bjinse

5
@Bjinse - Bazı DBMS, türetilmiş tüm tabloların bir takma adı olmasını gerektirir. Hepsi kabul edecek, bu yüzden dahil etmek acıtmayacak. Cevabıma ekleyeceğim.
Thomas

25

Oldukça geç olduğunu biliyorum, ama kimse bunu önermedi:

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

Bu en azından Oracle'da çalışıyor - Şu anda test etmek için başka veritabanlarım yok ve T-Sql ve MySQL sözdizimine pek aşina değilim.

Ayrıca, ayrıştırıcıda bu şekilde yapmanın daha verimli olup olmadığından veya herkesin select deyimini iç içe yerleştirme çözümünün daha iyi olup olmadığından tamamen emin değilim. Ama bunu kodlama açısından daha zarif buluyorum.


Thomas çözümüne cevabını ekledi. Neyse. Bunu bakım nedeniyle yapmak tavsiye etmem, diğer çözümler çok daha güzel.
Răzvan Flavius ​​Panda

@ RăzvanFlaviusPanda 1. Neden? Diğer çözümlerle ilgili güzel olan nedir? SQL'i yerleştirmek daha ayrıntılı ve gözlerimde, daha dağınık ve anlaşılması daha zor (destek açısından bakımı daha zor). Diğer yollar için bir tercih olabilir, ama bu başka birinin tercihine "tavsiye" için bir neden değildir. Thomas benzer bir öneri yaptı, evet, ama yine de SQL'i iç içe geçirme, çözümün gerekli olmayan bir parçası gibi görünüyor.
cartbeforehorse

12

Ben alt sorgu olmadan aynı elde etmeye çalışıyordu ve aşağıdaki gibi gerekli sonucu elde edebildi

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

4

Bir CTE benim için çalıştı:

with cte as (
  select 1 col1
  from temptable
  group by column_1
)

select COUNT(col1)
from cte;

3

Nasıl olur:

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

1

Şunları yapabilirsiniz:

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'de bu benim için çalışıyor:

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

1

Aşağıdaki kodu yürütebilir misiniz? Oracle'da çalıştı.

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

1
SQL sunucusundaki bir toplama içinde toplama çalıştırılamıyor.
A.Graensmith

0

ayrıca aşağıdaki sorgu ile alabilirsiniz

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

FirstField öğesinin birden çok değeri olabileceği PrestoDb için aşağıdakiler :

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 Server'da bir COUNT OVER (PARTITION BY {sütun gruplamak}) bölümleme işlevi kullanmaya ne dersiniz?

Örneğin, ürün satışlarını ItemID'ye göre gruplamak istiyorsanız ve her bir farklı ItemID'nin bir sayısını istiyorsanız, şunu kullanın:

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

Bu yaklaşımı kullanırsanız, tüm listeyi döndürmek istediğinizi varsayarak GROUP BY'ı resmin dışında bırakabilirsiniz (bantlamayacağınız öğelerin sayısını bilmeden ihtiyaç duyduğunuz yerde bantlamayı rapor edebilirsiniz veri kümesinin tamamını görüntülemek için (örn. Raporlama Servisleri).


BandedItemCountTam olarak hangi değer içerecek? Çıkış satırları arasında fark var mı? Asker, farklı gruplama düzeylerinin sayısını arıyor.
Julian
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.