MySQL中按类别列出的产品价格总和
我有三个表,MySQL中按类别列出的产品价格总和,mysql,Mysql,我有三个表,客户,产品,类别,如下所示: 顾客: id last_name ----------------- 100 Terry 200 molly 300 John 产品: id name description price category_id customer_id ------------------------------------------------------------------- 1 pro
客户
,产品
,类别
,如下所示:
顾客:
id last_name
-----------------
100 Terry
200 molly
300 John
产品:
id name description price category_id customer_id
-------------------------------------------------------------------
1 product1 lorem ipsum 150 10 100
2 product2 lorem ipsum 100 10 100
3 product3 lorem ipsum 300 20 200
类别:
id name
---------
10 bags
20 toys
30 phones
预期结果:
customerID customerLastName bags toys phones
100 Terry 250 0 0
200 Molly 0 300 0
300 John 0 0 0
如您所见,所需的结果是按类别列出的产品价格总和。因此,对于第一个客户,他只有与类别bags
相关的产品,因此我们应该有一个bags
列,其中产品价格的总和为(产品1为100,产品2为150,总计250)
如果客户在某个类别中没有任何产品,则该类别列中的值应为0
我试过这个:
select
customers.id as customerID,
customers.last_name as customerLastName,
SUM(CASE WHEN products.category_id = 10 THEN 1 ELSE NULL END) AS 'bags',
SUM(CASE WHEN products.category_id = 20 THEN 1 ELSE NULL END) AS 'toys',
SUM(CASE WHEN products.category_id = 30 THEN 1 ELSE NULL END) AS 'phones'
from customers
left join products on products.customer_id = customers.id
left join categories on products.category_id = categories.id
group by customers.id
但我得到的结果是:
customerID customerLastName bags toys phones
100 Terry 2 0 0
200 Molly 0 1 0
300 John 0 0 0
使用
然后是products.price
更改然后是1
,以聚合价格
值。另外,如果您没有指定ELSE NULL
,则默认情况下,它将仅为NULL
select
customers.id as customerID,
customers.last_name as customerLastName,
SUM(CASE WHEN products.category_id = 10 THEN products.price END) AS 'bags',
SUM(CASE WHEN products.category_id = 20 THEN products.price END) AS 'toys',
SUM(CASE WHEN products.category_id = 30 THEN products.price END) AS 'phones'
from customers
left join products on products.customer_id = customers.id
left join categories on products.category_id = categories.id
group by customers.id
我完全忽略了这一点,谢谢,我可以问一下,如果手动为每个类别执行<代码>操作,是否有一种方法不必执行<代码>案例?@dwix如果有更多类别;这基本上意味着一个数据透视表问题。如果列数是动态的,我建议在应用程序代码中处理这个问题。不过,你可以问这个问题:完成了,我不得不等几分钟才能接受。