Подсчитать количество записей, возвращаемых группой - PullRequest
114 голосов
/ 28 февраля 2011

Как подсчитать количество записей, возвращаемых группой по запросу,

Например:

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

дает мне,

1
1
2

Мне нужно посчитать вышеупомянутые записи, чтобы получить 1 + 1 + 1 = 3.

Ответы [ 13 ]

150 голосов
/ 28 февраля 2011

Вы можете сделать оба в одном запросе, используя предложение OVER для другого COUNT

select
    count(*) RecordsPerGroup,
    COUNT(*) OVER () AS TotalRecords
from temptable
group by column_1, column_2, column_3, column_4
57 голосов
/ 28 февраля 2011

Самое простое решение - использовать производную таблицу:

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
23 голосов
/ 01 мая 2012

Я знаю, что уже поздно, но никто не предложил это:

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

Это работает, по крайней мере, в Oracle - у меня нет других баз данных для тестирования, и я не такзнакомы с синтаксисом T-Sql и MySQL.

Кроме того, я не совсем уверен, является ли более эффективным в синтаксическом анализаторе, чтобы сделать это таким образом, или же решение всех остальных о вложении оператора select лучше.Но я считаю, что это более элегантно с точки зрения кодирования.

8 голосов
/ 06 марта 2014

Я пытался добиться того же без подзапроса и смог получить требуемый результат, как показано ниже

SELECT DISTINCT COUNT(*) OVER () AS TotalRecords
FROM temptable
GROUP BY column_1, column_2, column_3, column_4
4 голосов
/ 08 января 2013

CTE работал для меня:

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

select COUNT(col1)
from cte;
2 голосов
/ 28 февраля 2011

Как насчет:

SELECT count(column_1)
FROM
    (SELECT * FROM temptable
    GROUP BY column_1, column_2, column_3, column_4) AS Records
1 голос
/ 26 июня 2014

Можете ли вы выполнить следующий код ниже. Это работало в Oracle.

SELECT COUNT(COUNT(*))
FROM temptable
GROUP BY column_1, column_2, column_3, column_4
1 голос
/ 15 января 2014

В PostgreSQL это работает для меня:

select count(count.counts) 
from 
    (select count(*) as counts 
     from table 
     group by concept) as count;
1 голос
/ 28 февраля 2011

Вы можете сделать:

select sum(counts) total_records from (
    select count(*) as counts
    from temptable
    group by column_1, column_2, column_3, column_4
) as tmp
0 голосов
/ 11 июля 2018

Для 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
...