2017-03-03 13 views
1
私は以下の表を持っている

取得データ - SQL

表検索:

Date  Product Search_ID 
2017-01-01 Nike   101 
2017-01-01 Reebok   292 
2017-01-01 Nike   103 
2017-01-01 Adidas   385 
2017-01-02 Nike   284 

表の購入

Date  Product Total_sale 
2017-01-01 Adidas  4 
2017-01-01 Nike   1 
2017-01-01 Adidas  2 
2017-01-02 Nike   3 

各製品は、同じ日のうちに複数の行を持つことができます。その日の商品の購入総額=合計(合計額)

商品ごとの購入比率、つまり購入数/検索数を調べる必要があります。

select t1.product, sum(t1.Total_sale), count(t2.Search_ID) 
from db.purchases t1 join db.searches 
on t1.date = t2.date and t1.product = t2.product 
where t1.date = '2017-01-01' and t1.product = 'Nike' 
group by t1.product, t1.date 
; 

、これが与える:購入の総数は私が試し4 7/702 = 0.0669

の購入率を与え、47である参考

は、2017-01-01でナイキのために、検索の総数は702あります私は奇妙な結果:

product | sum | count 
----------+-------+------- 
    Nike | 32994 | 32994 

...私はここで間違っていますか?

答えて

1

は加入:

select p.product, p.sales, s.searches 
from (select p.date, p.product, sum(p.Total_sale) as sales 
     from db.purchases p 
     group by p.date, p.product 
    ) p join 
    (select s.date, s.product, count(*) as searches 
     from db.searches s 
     group by s.date, s.product 
    ) s 
    on p.date = s.date and p.product = s.product 
where p.date = '2017-01-01' and p.product = 'Nike'; 

注:あなたが移動することができますwhereをサブクエリに追加すると、パフォーマンスが向上します。これは、より多くの日と製品に容易に一般化されます。

2

結合によって結果セットが増えました。GROUP BYを削除すると表示され、指定したフィールドの代わりに*が使用されます。

select * from db.purchases t1 join db.searches 
on t1.date = t2.date and t1.product = t2.product 
where t1.date = '2017-01-01' and t1.product = 'Nike' 

あなたが購入比率を計算するためにテーブルを結合する必要はありません。集計にインクルードを行い

SELECT  
(select sum(t1.Total_sale) from db.purchases t1 where t1.date = '2017-01-01' and t1.product = 'Nike') 
/
(select count(t2.Search_ID) from db.searches t2 where t2.date = '2017-01-01' and t2.product = 'Nike') 
1

問題は、集計されていない2つのテーブルを結合しているため、各「購入」行が各「検索」行と結合されていることです。したがって、参加して所望の結果を達成するための正しい方法は

select t1.product, t1.total_sales, t2.search_count 
from (
      select date, product, sum(total_sales) as total_sales 
      from db.purchases 
      group by date, product 
     ) t1 
join (
      select date, product, count(search_id) as search_count 
      from db.searches 
      group by date, product 
     ) t2 
on  t1.date = t2.date and t1.product = t2.product 
where t1.date = '2017-01-01' and t1.product = 'Nike' 
group by t1.product, t1.date; 
だろう702のx 49

から来て、あなたの結果32994、