繁体   English   中英

MySQL枢轴将一行排成一列

[英]MySQL pivot to make a row into a colum

我有三个表, productscustomersorder

产品:

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

当我进行查询以显示按vendor类别的客户进行的交易时

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"

我会得到类似的东西:

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

我想要这个代替:

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

虽然零售商的外观如下所示:

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

只需使用条件聚合来旋转列。 并确保使用显式联接而不是已弃用的隐式联接,因为前者在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

我认为您不能直接从一个简单的选择中获得这种响应结构

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

因为您的数据库正在为每个零售商/客户订单排一行。

我知道使用诸如PHP或Java之类的服务器语言,您将可以处理数据并根据需要进行检索。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM