wake-up-neo.com

Zählen Sie die Anzahl der Datensätze, die von group by zurückgegeben wurden

Wie zähle ich die Anzahl der Datensätze, die von einer Gruppe per Abfrage zurückgegeben wurden?

Zum Beispiel:

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

Gibt mir,

1
1
2

Ich muss die obigen Datensätze zählen, um 1 + 1 + 1 = 3 zu erhalten.

116
Chris

Sie können beide in einer Abfrage ausführen, indem Sie die OVER-Klausel für einen anderen COUNT verwenden

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

Die einfachste Lösung ist die Verwendung einer abgeleiteten Tabelle:

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

Eine andere Lösung ist die Verwendung eines Count Distinct:

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
58
Thomas

Ich weiß, dass es ziemlich spät ist, aber niemand hat das vorgeschlagen:

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

Das funktioniert zumindest in Oracle - ich habe derzeit keine anderen Datenbanken, auf denen ich es testen könnte, und ich bin nicht so vertraut mit der T-Sql- und MySQL-Syntax.

Ich bin mir auch nicht ganz sicher, ob es effizienter ist, den Parser auf diese Weise auszuführen, oder ob die Verschachtelungslösung der select-Anweisung für alle anderen besser ist. Aber ich finde dieses Modell aus der Perspektive des Programmierens eleganter.

23
cartbeforehorse

Ich habe versucht, dasselbe ohne Unterabfrage zu erreichen und konnte das unten angegebene Ergebnis erzielen

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

Ein CTE arbeitete für mich:

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

select COUNT(col1)
from cte;
4
SQL Pete

Wie wäre es mit:

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

In PostgreSQL funktioniert das für mich:

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

Du könntest es tun:

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
troutinator

Können Sie den folgenden Code ausführen. Es hat in Oracle funktioniert.

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

Versuchen Sie diese Abfrage:

select top 1 TotalRows = count(*) over () 
from yourTable
group by column1, column2

sie können auch durch die folgende Abfrage erhalten

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
Nitish Sahoo

Folgendes für PrestoDb , wobei FirstField mehrere Werte haben kann:

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
0
SUKUMAR S