-1

次のような400万行を超える巨大なデータベースがあります。

Customer ID Shop 
1           Asda 
1           Sainsbury
1           Tesco 
2           TEsco 
2           Tesco

過去 4 週間以内に Tesco Sainsbury と Asda の 3 つの店舗すべてで買い物をした顧客を数える必要があります。サブクエリでそれが可能かどうかアドバイスをお願いできますか?

4

1 に答える 1

0

これは、「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
于 2013-07-04T19:46:46.477 に答える