135

たとえば、テーブルが次のような場合、特定の条件に従って列内の個別のアイテムの数をカウントしたい:

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

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

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

4

6 に答える 6

327

これを試すことができます:

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...)は簡単です。case...when2 番目のものはやや複雑に見えますが、節を使用することを除いて、実際には最初のものと同じです。case...when句では、正の値のみをフィルタリングします。ゼロまたは負の値は として評価さnullれ、カウントには含まれません。

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

于 2012-12-27T00:58:10.320 に答える
2

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

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
于 2012-12-27T01:01:28.770 に答える
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条件が必要です。

于 2012-12-27T01:12:46.243 に答える