条件付きのCOUNT DISTINCT


104

たとえば、表が次のような場合、特定の条件の対象となる列内の個別のアイテムの数をカウントしたいと思います。

tag | entryID
----+---------
foo | 0
foo | 0
bar | 3

同じテーブルで、個別のタグの数を「タグカウント」としてカウントし、エントリID> 0の個別のタグの数を「正のタグカウント」としてカウントする場合、どうすればよいですか?

現在、2つの異なるテーブルからカウントしています。2番目のテーブルでは、entryIDが0より大きい行のみを選択しています。この問題を解決するには、もっとコンパクトな方法が必要だと思います。

回答:


257

あなたはこれを試すことができます:

select
  count(distinct tag) as tag_count,
  count(distinct (case when entryId > 0 then tag end)) as positive_tag_count
from
  your_table_name;

最初count(distinct...)は簡単です。2番目はやや複雑に見えますが、case...when句を使用することを除いて、最初のものと実際は同じです。ではcase...when句、あなたは正の値のみをフィルタリングします。ゼロまたは負の値はとして評価さnullれ、countには含まれません。

ここで注意すべき点の1つは、これはテーブルを1回読み取ることで実行できることです。同じテーブルを2回以上読み取る必要があると思われる場合、ほとんどの場合、実際には1回の読み取りで実行できます。その結果、少ないI / Oでタスクをはるかに速く完了します。


2
しかし、それからpositive_tag_countも区別されますか?
derekhh

編集されたクエリはまだ問題を解決しません-これは現在、個別のタグではなく個別のentryId値で機能していませんか?
BrianC、

これは本当に賢い溶液です。
Luc

個別に複数の列があります(例count(distinct tag、date))。then句に複数の列を含める方法はありますか?タグを作成するだけの場合、日付に解析例外がスローされます
Crusaderpyro

@Crusaderpyroそれは元の質問の範囲を超えています。そのための新しい質問を作成します。
ntalbs 2018

2

次のステートメントを試してください。

select  distinct A.[Tag],
     count(A.[Tag]) as TAG_COUNT,
     (SELECT count(*) FROM [TagTbl] AS B WHERE A.[Tag]=B.[Tag] AND B.[ID]>0)
     from [TagTbl] AS A GROUP BY A.[Tag]

最初のフィールドはタグになり、2番目は全体の数、3番目は正の数になります。


1

これはうまくいくかもしれません:

SELECT Count(tag) AS 'Tag Count'
FROM Table
GROUP BY tag

そして

SELECT Count(tag) AS 'Negative Tag Count'
FROM Table
WHERE entryID > 0
GROUP BY tag

0

これもうまくいくかもしれません:

SELECT 
    COUNT(DISTINCT T.tag) as DistinctTag,
    COUNT(DISTINCT T2.tag) as DistinctPositiveTag
FROM Table T
    LEFT JOIN Table T2 ON T.tag = T2.tag AND T.entryID = T2.entryID AND T2.entryID > 0

最初のDISTINCTでentryIDが0のみのアイテムが適切にカウントされるようにするには、where句ではなく左結合にentryID条件が必要です。


1
このクエリは、テーブルを2回読み取ります。これは、テーブルを1回だけ読み取ることで実行できます。
ntalbs 2012

0

[エントリID]> 0の場合、コードはタグとエントリIDの一意/明確な組み合わせをカウントします

select count(distinct(concat(tag,entryId)))
from customers
where id>0

出力に一意の値の数が表示されます

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.