2016-10-14 12 views
0

私は販売テーブルを持っており、各メンバーに過去3ヶ月間に最も頻繁に買い物をしたいと思っています。次のクエリでは、すべてのストアのすべてのメンバーが取得されますが、メンバーごとにストアが1つだけ必要です。MySQLは別の行で最上位の行グループを選択します

SELECT member_id, store_id, COUNT(DISTINCT docket) as docket_count, SUM(dollar_amount) as dollars 
FROM sales 
WHERE TIMESTAMPDIFF(MONTH, sale_date, CURDATE()) < 3 
GROUP BY member_id, store_id 
ORDER BY member_id, docket_count DESC, dollars DESC 

それともこれはトリッキーです

SELECT store_id, COUNT(DISTINCT docket) as docket_count, SUM(dollar_amount) as dollars 
FROM sales 
WHERE TIMESTAMPDIFF(MONTH, sale_date, CURDATE()) < 3 
AND member_id = 1 
GROUP BY store_id 
ORDER BY docket_count DESC, dollars DESC 

答えて

1

単一のメンバーのためのトップ店を取得します。 MySQLでは、これはgroup_concat()/substring_index()のトリックを使用して最も簡単です:

SELECT member_id, 
     SUBSTRING_INDEX(GROUP_CONCAT(store_id ORDER BY docket_count DESC dollars DESC), ',', 1) as Most_Common_Store 
FROM (SELECT member_id, store_id, COUNT(DISTINCT docket) as docket_count, 
      SUM(dollar_amount) as dollars 
     FROM sales 
     WHERE sale_date >= CURDATE() - interval 3 month 
     GROUP BY member_id, store_id 
    ) ms 
GROUP BY member_id; 
関連する問題