次のような400万行を超える巨大なデータベースがあります。
Customer ID Shop
1 Asda
1 Sainsbury
1 Tesco
2 TEsco
2 Tesco
過去 4 週間以内に Tesco Sainsbury と Asda の 3 つの店舗すべてで買い物をした顧客を数える必要があります。サブクエリでそれが可能かどうかアドバイスをお願いできますか?
これは、「set-within-sets」サブクエリの例です。集計で解決できます。
select customer_id
from Yourtable t
where <shopping date within last four weeks>
group by customer_id
having sum(case when shop = 'Asda' then 1 else 0 end) > 0 and
sum(case when shop = 'Sainsbury' then 1 else 0 end) > 0 and
sum(case when shop = 'Tesco' then 1 else 0 end) > 0;
この構造は非常に柔軟です。したがって、Sainsbury ではなく Asda と Tesco が必要な場合は、次のようにします。
select customer_id
from Yourtable t
where <shopping date within last four weeks>
group by customer_id
having sum(case when shop = 'Asda' then 1 else 0 end) > 0 and
sum(case when shop = 'Sainsbury' then 1 else 0 end) = 0 and
sum(case when shop = 'Tesco' then 1 else 0 end) > 0;
編集:
カウントが必要な場合は、これをサブクエリとして使用し、結果をカウントします。
select count(*)
from (select customer_id
from Yourtable t
where <shopping date within last four weeks>
group by customer_id
having sum(case when shop = 'Asda' then 1 else 0 end) > 0 and
sum(case when shop = 'Sainsbury' then 1 else 0 end) > 0 and
sum(case when shop = 'Tesco' then 1 else 0 end) > 0
) t