2017-11-23 3 views
0

私は3つのテーブル、productscustomersを、持っているorderMySQLのピボットはcolumに行を作るために

製品:

id | name | 
1 | milk | 
2 | bread| 
3 | Pea | 

お客様:

id | name | category 
1 | James | retailer 
2 | Paul | vendor 
3 | Dave | retailer 

注文:

id | product_id | customer_id | qty | price 
1 | 1   | 2   | 23 | 50 
2 | 2   | 2   | 4 | 30 
3 | 3   | 2   | 6 | 10 
4 | 2   | 1   | 9 | 30 
5 | 3   | 1   | 2 | 10 
6 | 1   | 3   | 6 | 50 
7 | 3   | 3   | 7 | 10 

私は

SELECT customer.name, product.name as pname, order.qty, order.price FROM customer, product, order 
WHERE customer.id = order.customer_id 
AND product.id = order.product_id AND customer.category = "vendor" 

ようvendorのカテゴリに顧客が取引を表示するクエリを実行すると、私のようなものでしょう:

name | milk | bread | pea | total 
Paul | 23 | 4  | 6 | 90 

はしばらく:

name | pname | qty | price 
Paul | milk | 23 | 50 
Paul | bread | 4 | 30 
Paul | pea | 6 | 10 

を私が代わりにこれをしたいです小売業者の商品は次のようになります:

SELECT customer.name, product.name as pname, order.qty, order.price FROM 
customer, product, order 
WHERE customer.id = order.customer_id 
AND product.id = order.product_id AND customer.category = "retailer" 

私はこのようなテーブルを取得します:

name | pname | qty | price 
James | bread | 9 | 30 
James | pea | 2 | 10 
Dave | milk | 6 | 50 
Dave | pea | 7 | 10 

をしかし、私はこの代わりにしたい:

name | milk | bread | pea | total 
James | 0  | 9  | 2 | 40 
Dave | 6  | 0  | 7 | 60 
+0

関連:https://stackoverflow.com/questions/7674786/mysql-pivot-table – Kalecser

答えて

1

ピボット列に条件付き集計を使用するだけです。また、ANSI-92では25年の標準であるため、非推奨の暗黙的な結合ではなく明示的な結合を使用してください。

SELECT c.name, 
     SUM(CASE WHEN p.name = 'milk' THEN o.qty ELSE 0 END) as milk, 
     SUM(CASE WHEN p.name = 'bread' THEN o.qty ELSE 0 END) as bread, 
     SUM(CASE WHEN p.name = 'pea' THEN o.qty ELSE 0 END) as pea, 
     SUM(o.price) AS Total 
FROM `customer` c 
INNER JOIN `order` o 
    ON c.id = o.customer_id 
INNER JOIN `product` p 
    ON p.id = o.product_id 
WHERE c.category = 'vendor' -- same for retailer 
GROUP BY c.name 
+0

素晴らしいです!ちょうど私が必要なもの。ありがとう – user2666633

0

は、私はあなたが選ぶ1つの単純なものから直接この応答構造を持つことができないと思います

name | milk | bread | pea | total 
James | 0  | 9  | 2 | 40 
Dave | 6  | 0  | 7 | 60 

データベースが1つの行をforeach小売業者/顧客の注文としているためです。

私は、PHPやJavaのようなサーバー言語を使用すると、データを処理して、必要に応じて検索できることを知っています。

関連する問題