2016-05-13 10 views
1

私はcolum3のカウントを取得したいが、column1とcolumn2でグループ化したいので、column2は常にcolumn2の同じ(すべて)値を持つ。集計関数で複数レベルグループのすべてのレベルのすべての値を繰り返す

私の現在のバージョン:http://sqlfiddle.com/#!9/00d9d/1/0

コード:

CREATE TABLE table1 
    (`column1` varchar(2), `column2` varchar(2), `column3` varchar(2)) 
; 

INSERT INTO table1 
    (`column1`, `column2`, `column3`) 
VALUES 
    ('aa', 'ba', 'ca'), 
    ('aa', 'ba', 'cb'), 
    ('aa', 'ba', 'cc'), 
    ('aa', 'bb', 'ca'), 
    ('aa', 'bb', 'cb'), 
    ('aa', 'bc', 'ca'), 
    ('aa', 'bc', 'cb'), 
    ('aa', 'ba', 'ca'), 
    ('ab', 'ba', 'cb'), 
    ('ab', 'bc', 'ca') 
; 

マイクエリ:

SELECT 
     column1 
     ,column2 
     ,COUNT(column3) 
    FROM 
     table1 
    GROUP BY 
     column1 
     ,column2 

結果今

column1 column2 COUNT(column3) 
aa ba 4 
aa bb 2 
aa bc 2 
ab ba 1 
ab bc 1 

は私QUですがestionどのようにして、すべてのcolumn1集約がcolumn2の同じ値であることを保証できますか?私は、だから私はカラム1の値ごと私はcolumn2のための同じ値のセットを持っていることを望ん

ab;bb;0 

を欠場例の場合。実際には、不足している値がカウントとして0でいっぱいになることを意味します。

+0

[よくある質問](http://stackoverflow.com/help/how-to-ask)をご覧ください。これはここで明白ではない努力の最小量を投資しなければならないという丁寧な言い方です。 –

+0

あなたの質問は不明です。改訂してください。 –

+0

@JarrodRoberson申し訳ありませんが、それをフィドルに入れて、さらに説明を加えました。今はっきりしていることを願っています。 – faulix90

答えて

0

まず、許可された値(column1 x column2)を生成してから、left joinこれをクエリで生成する必要があります。

select base1.column1, base2.column2, ifnull(YourQuery.cnt, 0) 
from (select distinct column1 from table1) as base1 
cross join (select distinct column2 from table1) as base2 
left join 
(SELECT column1,column2,COUNT(column3) as cnt 
FROM table1 
GROUP BY column1,column2 
) as YourQuery 
on YourQuery.column1 = base1.column1 and YourQuery.column2 = base2.column2; 
+0

非常に良いソリューションと説明、ありがとうございます。 – faulix90

0

アイデアは、すべての組み合わせを取得し、ギャップを埋めるために参加したり、組合に使用する基本的にここで私は、すべての組合を使用しています:あなたのクエリは、そうでない場合は、あなただけの0を取得します、それはそれを知っているのカウントを提供します。

SELECT 
    column1 
    ,column2 
    ,count(column3) 
from (
select column1, column2, column3 from table1 
union all 
select column1,column2, null as column3 
    from (select distinct column1 from table1) all_c1 
    cross join (select distinct column2 from table1) all_c2 
)t group by column1, column2; 
+0

ありがとう、@ソラフレアの解決策は少し優雅です(私の意見では)。 – faulix90

関連する問題