그룹별로 반환 된 레코드 수


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.