2012-04-23 6 views
2

ジョイントしている3つのテーブルから「ケース終了時」を使用して結果を返すクエリがあります。MySQL:ケースを使用して複数の内部ジョインテーブルを終了する場合

select f.filename, 
sum(case when v.rUser like '%bike%' then 1 else 0 end) as bikeUser, 
sum(case when v.rUser like '%Pedestrian%' then 1 else 0 end) as pedestrianUser, 
sum(case when d.weather like '%clear%' then 1 else 0 end) as clearWeather 
from VMdata v 
inner join files f on v.id = f.id 
inner join DMdata d on f.id = d.id 
where f.filename in (X,Y,Z) 
group by f.filename 

これは問題なく動作し、各結果行は正しく1または0を返します。ここで注意すべきことは、各テーブルには特定の "ファイル名"のエントリ(行)が1つしかないということです。 "ファイル名"ごとに複数のエントリ(行)を持つことができるテーブルで別の内部結合を追加しようとすると、最後の '合計'だけが正しい値を示すように結果が間違っています間違った値。この2番目のクエリは次のとおりです。

select f.filename, 
sum(case when v.rUser like '%bike%' then 1 else 0 end) as bikeUser, 
sum(case when v.rUser like '%Pedestrian%' then 1 else 0 end) as pedestrianUser, 
sum(case when d.weather like '%clear%' then 1 else 0 end) as clearWeather, 
sum(case when m.extras like '%hat%' then 1 else 0 end) as hatExtras 
from VMdata v 
inner join files f on v.id = f.id 
inner join DMdata d on f.id = d.id 
inner join MultiFiledata m on f.id = m.id 
where f.filename in (X,Y,Z) 
group by f.filename 

任意のアイデアは、すべての列の右の数字を取得するには?

答えて

0

1対多の結合が原因で全体の行数が増加するため、値が1の場合は、その値を複数回追加します。これを軽減するには、別のユーザーIDをカウントするためにcount関数を使用することができます。次のようなものがあります。

Count(distinct case when [logic goes here] then [user ID] else null end) as bikeuser 

次に、各行を追加するのではなく、各ユーザーを1回だけカウントします。

+0

おかげで、それは一対多数で使用した場合「明確な」は間違った値を生成することを除いて正常に動作します。 'distinct'を削除すると問題が解決しました。 – sunsa428

+0

別の質問:この場合、各列の合計はどのようにして得られますか?私がロールアップで**を使用すると、 'group by clause'(水平合計)によって生成されたグループの合計が得られますが、各カラムの垂直合計が必要です。 – sunsa428

1

filesテーブル内の対応するレコードの複数のレコードをテーブルに含めることができる場合は、別のクエリで集約してメインクエリに戻す必要があります。例えば

(構文は完璧ではないかもしれない。コンセプトに集中する):

select f.filename, 
     sum(case when v.rUser like '%bike%' 
        then 1 else 0 end) as bikeUser, 
     sum(case when v.rUser like '%Pedestrian%' 
        then 1 else 0 end) as pedestrianUser, 
     sum(case when d.weather like '%clear%' 
        then 1 else 0 end) as clearWeather 
from  VMdata v 
     inner join files f 
     on v.id = f.id 
     inner join DMdata d 
     on f.id = d.id 
     inner join (
      select id, 
        sum(case when extras like '%hat%' 
          then 1 else 0 end) as hatExtras 
      from MultiFiledata 
     ) m 
     on f.id = m.id 
where f.filename in (X,Y,Z) 
group by f.filename; 
+0

ありがとう、私はコンセプトを得た! – sunsa428

+0

別の質問:この場合、各列の合計はどのようにして取得できますか?私がロールアップで**を使用すると、 'group by clause'(水平合計)によって生成されたグループの合計が得られますが、各カラムの垂直合計が必要です。 – sunsa428

関連する問題