group byによって返されるレコードの数をカウントする


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 2011

2
質問を定式化する別の方法:特定のクエリに対して、個別のグループ化レベルの数を選択するにはどうすればよいですか?
ジュリアン

ユーザーが質問する理由は必ずしも明らかではありませんが、ビューの列が主キーまたは組み合わせキーの候補であるかどうかをテストしているので、ここに来ました。「select count(distinct COLUMNNAME)from VIEWNAME」がタイムアウトし、合計を取得できる場合はgroup byが機能します。
Ken Forslund

回答:


169

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

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

これはSQLサーバーの質問ですが、参考までに:これはDB / 2(私の場合はIBM iSeries)では機能しません。Thomasの回答でコメントを参照してください
Bjinse

そのカウントされた数をどのようにエコーしますか?
マクダンギャレット2013

1
このソリューションのこの欠点は、(の組み合わせごとにcolumn_1, column_2, column_3, column_4)複数回答えが得られることです。結果の処理方法に応じて、これは重大な副作用である場合とそうでない場合があります。
cartbeforehorse

3
レコードの数だけを返すには、[トップを追加(1)COUNT(*)を超える()など...
ギリェルメカンポスHazan

2
私の場合、TOP(1)COUNT()OVER()を使用すると、クエリのパフォーマンスが低下しました。グループの数だけが必要だったので、これをDISTINCT COUNT()OVER()に変更し、クエリのパフォーマンスが劇的に向上しました。
ジョーアルドリッチ

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ステートメントをネストする他のすべての人の解決策の方が優れているのか、完全にはわかりません。しかし、これはコーディングの観点からはよりエレガントであると思います。


トーマスはあなたの解決策を彼の答えに加えました。とにかく。メンテナンスの理由からこれを行うことはお勧めしません。他のソリューションの方がはるかに優れています。
–RăzvanFlavius Panda 2016

@RăzvanFlaviusPanda1.なぜですか?他のソリューションの何が良いですか?入れ子の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

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

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

1
sql-serverのアグリゲート内でアグリゲートを実行することはできません。
A. Greensmith 2016年

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正確に含まれますか?出力行によって異なりますか?質問者は、異なるグループ化レベルの数を探しています。
ジュリアン
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.