web-dev-qa-db-ja.com

グループによって返されたレコードの数をカウントします

クエリごとにグループから返されたレコードの数をカウントするにはどうすればよいですか、

例えば:

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

くれた

1
1
2

1 + 1 + 1 = 3を取得するには、上記のレコードをカウントする必要があります。

110
Chris

別のCOUNTでOVER句を使用して、1つのクエリで両方を実行できます

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

最も簡単な解決策は、派生テーブルを使用することです。

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

私はそれがかなり遅いことを知っていますが、誰もこれを提案していません:

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

これは少なくともOracleで機能します。現在、他のデータベースでテストすることはできません。また、T-SqlとMySQL構文にあまり詳しくありません。

また、この方法でパーサーを使用する方が効率的かどうか、またはselectステートメントをネストする他の全員のソリューションの方が優れているかどうかもわかりません。しかし、これはコーディングの観点から見てよりエレガントであると思います。

23
cartbeforehorse

私はサブクエリなしで同じことを達成しようとしていましたが、以下のように必要な結果を得ることができました

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

CTEは私のために働いた:

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

select COUNT(col1)
from cte;
4
SQL Pete

どうですか:

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

PostgreSQLでは、これは私のために機能します:

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

できること:

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

以下のコードを実行できますか。 Oracleで機能しました。

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

このクエリを試してください:

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

以下のクエリでも取得できます

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

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