2016-05-11 14 views
2

T-SQLでGroup by Cubeオプションを使用する方法について質問があります。私は空のセットを除く15の組み合わせを取得し、A、B、CとDのキューブではキューブによるSQLグループと各組み合わせの合計を取得

グループを使用して
UserID | A | B | C | D 
------------------------ 
    1  | 1 | 1 | 1 | 1 
    2  | 1 | 1 | 1 | 1 
    3  | 0 | 0 | 1 | 1 
    4  | 1 | 1 | 0 | 0 
    5  | 1 | 1 | 1 | 1 
    6  | 1 | 1 | 0 | 0 
    7  | 1 | 1 | 1 | 0 
    8  | 1 | 1 | 0 | 0 
    9  | 1 | 1 | 0 | 0 
    10 | 1 | 1 | 0 | 0 
    11 | 1 | 1 | 1 | 1 
    12 | 0 | 1 | 1 | 1 
    13 | 1 | 1 | 1 | 0 
    14 | 1 | 1 | 0 | 0 
    15 | 1 | 1 | 1 | 0 
    16 | 1 | 1 | 1 | 0 
    17 | 1 | 1 | 1 | 1 
    18 | 1 | 1 | 1 | 1 
    19 | 1 | 1 | 1 | 0 
    20 | 1 | 1 | 0 | 0 
    21 | 1 | 1 | 1 | 1 
    22 | 0 | 1 | 1 | 1 

:私は、だから私は、以下のようなテーブルを持っているのSQL Serverに2012

を使用しています。さて、私は各組み合わせの下にどれだけのユーザーがいるのかを知りたいと思います。そのような組み合わせのユーザーが1人もいない場合、私はまだその組み合わせを見たいと思っていますが、ユーザー数の列はゼロになる可能性があります。その結果出力は

A B C D Qty 
1    0 
    1   0 
     1  0 
      1 0 
1 1   7 
1  1  0 
1   1 0 
1 1 1  5 
1 1 1 1 7 
    1 1  0 
    1  1 0 
    1 1 1 2 
     1 1 1 
1 1  1 0 
1  1 1 0 

私はこれを達成することができます任意の方法をすべきですか?どんな助けも非常に高く評価されます!

答えて

2

私のアプローチは、すべての可能性のあるテーブルを作成し、通常のGROUP BYに対してLEFT JOINを使用することです。

一時的な実行の場合は、一時テーブルが大丈夫かもしれません。そうでない場合は、永続的なテーブルが最適なので、一時テーブルを常に作成および削除しているわけではありません。

/* Create a temporary table */ 
CREATE TABLE TEMPSO11052016 (A int, B int, C int, D int); 

/* Insert all possibilities on the temporary table */ 
INSERT INTO TEMPSO11052016 (A, B, C, D) 
VALUES (1,1,1,1),(1,1,1,0),(1,1,0,1),(1,0,1,1),(0,1,1,1), 
     (1,1,0,0),(1,0,1,0),(0,1,1,0),(1,0,0,1),(0,1,0,1),(0,0,1,1), 
     (1,0,0,0),(0,1,0,0),(0,0,1,0),(0,0,0,1),(0,0,0,0); 

/* Run the selection query */ 
SELECT T.A, T.B, T.C, T.D, ISNULL(CT, 0)   
FROM TEMPSO11052016 T 
LEFT JOIN (SELECT A, B, C, D, COUNT(ID) AS CT FROM SO11052016 GROUP BY A, B, C, D) S 
ON S.A=T.A AND S.B=T.B AND S.C=T.C AND S.D=T.D; 

/* Drop the temporary table */ 
DROP TABLE TEMPSO11052016; 
+1

完璧!これは定期的に生成されるレポートに必要です。私はその組み合わせで永久的なテーブルを作った。これは完全に機能します。あまりにもありがとう、@エド –

1

@Eduのレスポンスに似ていますが、クロスジョインを使用して「すべての組み合わせ」テーブルを作成します。

; with CTE as (select '' as Value 
       union all 
       select '1') 
, CTE2 as (Select a.Value as A, b.Value as B, c.Value as C, d.Value as D 
        from CTE a 
        cross join CTE b 
        cross join CTE c 
        cross join CTE d) 

select a.*, count(distinct b.UserID) from CTE2 a 
left join #mydata b 
on a.a = b.a and a.b = b.b and a.c = b.c and a.d = b.d 
group by a.A, a.B, a.C, a.D 
order by a.A, a.B, a.C, a.D 
+0

ありがとう! :)これは永久的なテーブルを作成する必要なしに動作します。 –

関連する問題