그룹별로 반환 된 레코드 수


138

검색어로 그룹이 반환 한 레코드 수를 계산하는 방법

예를 들어 :

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

1
1
2

1 + 1 + 1 = 3을 얻으려면 위의 레코드를 계산해야합니다.


3
@LorenVS : 그러나 그것은 테이블의 레코드 수를 알려줍니다. 그룹별로 발생하는 레코드 수가 필요합니다.
Chris

3
그룹 기준은 행 수를 변경하지 않습니다. 1 + 1 + 2 (예에서)는 테이블의 행 수입니다. 3을 찾고 있습니까? 별개의 그룹의 수는?
LorenVS

2
질문을 공식화하는 다른 방법 : 주어진 쿼리에 대해 고유 한 그룹화 레벨 수를 어떻게 선택합니까?
Julian

왜 사용자가 질문을하는지 분명하지는 않지만 뷰의 열이 후보 기본 키 또는 조합 키인지 테스트하기 때문에 여기에 왔습니다. "VIEWNAME에서 select count (distinct COLUMNNAME)"가 시간 초과됩니다. 여기서 총계를 얻을 수 있으면 그룹별로 작동합니다.
Ken Forslund

답변:


169

다른 COUNT의 OVER 절을 사용하여 한 쿼리에서 둘 다 수행 할 수 있습니다.

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

나는 이것이 SQL-Server 질문이라는 것을 알고 있지만 참조를 위해 : DB / 2 (내 경우에는 IBM iSeries)에서는 작동하지 않습니다. Thomas의 답변에 대한 내 의견보기
Bjinse

그 수를 어떻게 에코합니까?
McDan Garrett

1
이 솔루션의 단점은 ( column_1, column_2, column_3, column_4)의 각 조합에 대해 여러 번 답변을 제공한다는 것 입니다. 결과 처리 방법에 따라 이는 심각한 부작용 일 수도 있고 아닐 수도 있습니다.
cartbeforehorse

3
레코드 수만 반환하려면 다음과 같이 select top (1) count (*) over ()를 추가하십시오.
Guilherme Campos Hazan

2
필자의 경우 TOP (1) COUNT ( ) OVER ()를 사용하면 쿼리 성능이 떨어졌습니다. 그룹 수만 필요했기 때문에 이것을 DISTINCT COUNT ( ) OVER ()로 변경 했으며 쿼리 성능이 크게 향상되었습니다.
Joe Aldrich

71

가장 간단한 해결책은 파생 테이블을 사용하는 것입니다.

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

또 다른 해결책은 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

첫 번째 답변은 DB / 2에서도 작동하지만 어떤 이유로 든 작동하려면 AS TMP를 추가해야합니다 (troutinator 추가됨)
Bjinse

5
@Bjinse-일부 DBMS에서는 모든 파생 테이블에 별칭이 있어야합니다. 그들은 모두 그것을 받아 들일 것이므로 그것을 포함시키는 것이 아프지 않을 것입니다. 내 답변에 추가하겠습니다.
토마스

25

나는 그것이 늦다는 것을 알고 있지만 아무도 이것을 제안하지 않았다.

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

이것은 적어도 Oracle에서 작동합니다. 현재 테스트 할 다른 데이터베이스가 없으며 T-Sql 및 MySQL 구문에 익숙하지 않습니다.

또한 파서 에서이 방법을 사용하는 것이 더 효율적인지 또는 select 문을 중첩시키는 다른 모든 솔루션이 더 나은지 여부는 확실하지 않습니다. 그러나 나는 이것이 코딩 관점에서보다 우아하다고 생각합니다.


Thomas는 귀하의 솔루션을 그의 답변에 추가했습니다. 어쨌든. 유지 관리상의 이유로이 작업을 수행하지 않는 것이 좋습니다. 다른 솔루션이 훨씬 좋습니다.
Răzvan Flavius ​​Panda 9

@ RăzvanFlaviusPanda 1. 왜? 다른 솔루션에 대해 더 좋은 점은 무엇입니까? 중첩 SQL은 더 장황하고 내 눈에 더 지저분하고 이해하기가 어렵습니다 (지원 의미로 유지하기가 더 어렵습니다). 다른 방법을 선호 할 수도 있지만 다른 사람의 선호보다 "권장"하는 이유는 아닙니다. Thomas는 비슷한 제안을했지만 SQL 중첩은 솔루션의 필수 부분 인 것처럼 보이지만 그렇지 않습니다.
cartbeforehorse

12

하위 쿼리없이 동일한 결과를 얻으려고했지만 아래와 같이 필요한 결과를 얻을 수있었습니다.

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

4

CTE가 나를 위해 일했습니다.

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

select COUNT(col1)
from cte;

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-server의 집계 내에서 집계를 실행할 수 없습니다.
A. Greensmith

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 Server에서 COUNT OVER (PARTITION BY {column to group by}) 파티셔닝 기능을 사용하는 것은 어떻습니까?

예를 들어, ItemID별로 제품 판매를 그룹화하고 각 고유 한 ItemID의 수를 원하면 다음을 사용하십시오.

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

이 방법을 사용하는 경우 전체 목록을 반환하려는 경우 GROUP BY를 그림에서 벗어날 수 있습니다 (밴드없이 보려고하는 전체 항목 수를 알아야하는 경우 보고서 밴딩을 수행 할 수 있음) 전체 데이터 세트 (예 : Reporting Services)를 표시합니다.


BandedItemCount정확히 어떤 가치가 포함됩니까? 출력 행간에 차이가 있습니까? 질문자는 고유 한 그룹화 수준을 찾고 있습니다.
Julian
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.