Jak policzyć liczbę rekordów zwróconych przez grupę według zapytania,
Na przykład:
select count(*)
from temptable
group by column_1, column_2, column_3, column_4
Daje mi,
1
1
2
Muszę policzyć powyższe rekordy, aby uzyskać 1 + 1 + 1 = 3.
Jak policzyć liczbę rekordów zwróconych przez grupę według zapytania,
Na przykład:
select count(*)
from temptable
group by column_1, column_2, column_3, column_4
Daje mi,
1
1
2
Muszę policzyć powyższe rekordy, aby uzyskać 1 + 1 + 1 = 3.
Odpowiedzi:
Możesz zrobić oba w jednym zapytaniu, używając klauzuli OVER na innym COUNT
select
count(*) RecordsPerGroup,
COUNT(*) OVER () AS TotalRecords
from temptable
group by column_1, column_2, column_3, column_4
column_1, column_2, column_3, column_4
). Może to być znaczący efekt uboczny lub nie, w zależności od sposobu przetwarzania wyników.
Najprostszym rozwiązaniem jest użycie tabeli pochodnej:
Select Count(*)
From (
Select ...
From TempTable
Group By column_1, column_2, column_3, column_4
) As Z
Innym rozwiązaniem jest użycie 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
Wiem, że jest dość późno, ale nikt tego nie zasugerował:
select count ( distinct column_1, column_2, column_3, column_4)
from temptable
Działa to przynajmniej w Oracle - obecnie nie mam innych baz danych do przetestowania i nie jestem zbyt zaznajomiony ze składnią T-Sql i MySQL.
Nie jestem też do końca pewien, czy bardziej wydajne jest to w parserze, aby zrobić to w ten sposób, czy też rozwiązanie zagnieżdżania instrukcji select dla wszystkich innych jest lepsze. Ale uważam, że ten jest bardziej elegancki z punktu widzenia kodowania.
Próbowałem osiągnąć to samo bez podzapytania i udało mi się uzyskać wymagany wynik, jak poniżej
SELECT DISTINCT COUNT(*) OVER () AS TotalRecords
FROM temptable
GROUP BY column_1, column_2, column_3, column_4
Mógłbyś:
select sum(counts) total_records from (
select count(*) as counts
from temptable
group by column_1, column_2, column_3, column_4
) as tmp
Czy możesz wykonać poniższy kod? To działało w Oracle.
SELECT COUNT(COUNT(*))
FROM temptable
GROUP BY column_1, column_2, column_3, column_4
Możesz również uzyskać poniższe zapytanie
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
Spróbuj tego zapytania:
select top 1 TotalRows = count(*) over ()
from yourTable
group by column1, column2
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
Co powiesz na użycie funkcji partycjonowania COUNT OVER (PARTITION BY {column to group by}) w SQL Server?
Na przykład, jeśli chcesz pogrupować sprzedaż produktów według ItemID i chcesz zliczać każdy odrębny ItemID, po prostu użyj:
SELECT
{columns you want} ,
COUNT(ItemID) OVER (PARTITION BY ItemID) as BandedItemCount ,
{more columns you want}... ,
FROM {MyTable}
Jeśli zastosujesz to podejście, możesz pozostawić GROUP BY poza obrazem - zakładając, że chcesz zwrócić całą listę (tak jak możesz zgłosić pasmowanie, w którym musisz znać całą liczbę elementów, które zamierzasz połączyć, bez konieczności posiadania wyświetlić cały zestaw danych, czyli usługi Reporting Services).
BandedItemCount
dokładnie wartość ? Czy różni się między wierszami wyjściowymi? Pytający szuka liczby różnych poziomów grupowania.