1

私が聞きたいことは、例によって最もよく説明されているので、我慢してください. 次のテーブルがあるとします。

TypeID  Gender      Count
1       M           10
1       F           3
1       F           6  
3       M           11
3       M           8

TypeID と Gender の可能なすべての組み合わせについて、これを集計したいと思います。TypeID は 1、2、または 3 で、Gender は M または F です。したがって、私が望むのは次のとおりです。

TypeID  Gender      SUM(Count)
1       M           10
1       F           9
2       M           0  
2       F           0
3       M           19
3       F           0

これを行う可能性のあるいくつかの方法を考えることができますが、どれも特に洗練されているとは思えません。

どんな提案でも大歓迎です!

カール

4

2 に答える 2

6

派生テーブルを使用して、返したい行を作成し、左結合してカウントを取得します。COALESCE を使用して、NULL カウントをゼロにします。

SELECT TypeIds.TypeId, Genders.Gender, COALESCE(SUM(T1.Count), 0)
FROM (
    SELECT 1 AS TypeId
    UNION ALL
    SELECT 2
    UNION ALL
    SELECT 3
) AS TypeIds
CROSS JOIN (
    SELECT 'M' AS Gender
    UNION ALL
    SELECT 'F'
) AS Genders
LEFT JOIN Table1 AS T1
ON TypeIds.TypeId = T1.TypeId AND Genders.Gender = T1.Gender
GROUP BY TypeIds.TypeId, Genders.Gender

結合できるように、データベースにこれらの性別およびタイプ ID テーブルを作成することを検討する価値があるかもしれません。許可されたタイプ ID のリストが将来変更される可能性がある場合は、ハードコーディングされた値のリストを持つすべてのクエリではなく、テーブルを更新するだけで済みます。

于 2010-03-15T07:25:28.143 に答える
0

テーブルに含まれていないレコードを含む一時テーブルを作成してから、このスクリプトを実行してみてはどうでしょうか?

SELECT TypeID, Gender, [Count]=ISNULL(Count(*),0)  
  FROM <TABLE> 
GROUP BY TypeID, Gender
于 2010-03-15T07:21:00.347 に答える