2016-06-01 13 views
1

テーブルLOGに私はSQLで次の2つの表を作成しようとしている次のエントリ複雑なSQLクエリの集計とグループ化

userid  item  role 
1   Apple Buyer 
2   Banana Seller 
3   Apple Buyer 
1   Banana Seller 
3   Orange Buyer 
etc 

を持っています。表1:

item  countUser1Buy  countUser1Sell 
Apple 
Banana 
Orange 

および表2(ここで私は合計の平均値を意味し、総リンゴの平均は

item  alluserBuyTotalMean  allUserBuyTotalMedian allUserBuyRange allUserBuyStandardDev 
Apple 
Banana 
Orange 

を買って、のように私は最初は

に変化されるべきだと思います。私に与えて近い
`SELECT `item`, `role`, count(`item`) as count FROM `LOG` GROUP BY `item` 

item role count 
Apple Buyer 1 
Banana Seller 1 

しかし、私は取得しようとしているようにそれを作る方法を把握できません。私は本当に困っています。おかげ

答えて

1

まずクエリ:

SELECT item 
    , SUM(role = 'Buyer') AS countUser1Buy 
    , SUM(role = 'Seller') AS countUser1Sell 
    FROM LOG 
WHERE userid = 1 
GROUP BY item; 

2番目のクエリ:

SELECT item 
    , AVG(total) AS alluserBuyTotalMean 
    , CONCAT(MIN(total), ' - ', MAX(total)) AS allUserBuyRange 
    , STDDEV_POP(total) AS allUserBuyStandardDev 
    FROM (
     SELECT item 
      , COUNT(*) AS total 
     FROM LOG 
     WHERE role = 'Buyer' 
     GROUP BY item, userid 
     ) t 
GROUP BY item; 
2

あなたはこのため条件付き集約が必要になります。

SELECT `item`, 
     COUNT(CASE WHEN role='Seller' THEN 1 END) AS countUserSell, 
     COUNT(CASE WHEN role='Buyer' THEN 1 END) AS countUserBuy 
FROM `LOG` 
GROUP BY `item` 
1
SELECT 
`item` 
,SUM(CASE WHEN `userid`= 1 AND `role` = 'Buyer' THEN 1 ELSE 0 END) as countUser1Buy 
,SUM(CASE WHEN `userid` = 1 AND `role` = 'Seller' THEN 1 ELSE 0 END) as countUser1Sell 
FROM `LOG` 
GROUP BY Item 

あなたは、各ユーザーIDのための新しいCASE声明を加える必要がありますが、これは動作するはずです。以下のような結果になります。

item countUser1Buy countUser1Sell 
Apple 1    0 
Banana 0    1 
Orange 0    0