2

結合された3つのテーブルから「CaseWhenThenEnd」を使用して結果を返すクエリがあります。次のようになります。

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

すべての列に適切な数値を取得するためのアイデアはありますか?

4

2 に答える 2

1

MultiFiledataテーブルに対応するレコードの複数のレコードをテーブルに含めることができる場合は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;
于 2012-04-23T17:18:10.327 に答える
0

1対多の結合により、全体の行数が増加しているため、value = 1の場合、その値を複数回追加しています。これを軽減するには、代わりにカウント関数を使用して、個別のユーザーIDをカウントすることをお勧めします。何かのようなもの:

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

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

于 2012-04-23T17:14:54.820 に答える