我有4张 table
customers
sales
sale_items
stock_items
我想列出我所有的客户。对于每个客户,我想要购买的总金额 - 我希望 sql 查询创建的字段(xxx 作为 totalSales)
我尝试选择客户作为主表并加入其他表。我尝试选择 sales 作为主表以及 sale_items。我得到了正确的总和计算,但它会先显示第一个客户。
这是我的表格的样子:
*TABLE customers*
id
customer_name
email
*TABLE sales*
id
customer_id
transaction_date
*TABLE sale_items*
id
sale_id
stock_item_id
*TABLE stock_items*
id
item_name
price
我要
- 创建一个包含所有客户的列表,按销售额(值(value))最高的客户排在最前面。不是销售额的数量,而是销售额的总金额(销售额)
- 在客户名称下显示每位客户购买的商品。这不是针对每个订单,而是针对所有销售。因此,如果客户 X 购买了一 jar 咖啡,每次订购超过 4 次,则该 jar 咖啡将显示 4 次。不过,如果可能的话,我希望列出 a-z 的项目。
我已经在内部连接了彼此的表,所以我会得到所有交易的列表。我试过 SELECT * FROM customers,试过 FROM sales,试过 sale_items。我试过 GROUP_BY customer_id,但我会得到不正确的计数。
我想这样显示数据。
CUSTOMER ITEMS TOTAL VALUE
John Doe Coffee
Milk
Tea
Milk
Bread
Coffee 500
Jane Doe Coffee
Milk
Coke 350
Denver Doe Coffee
Milk
Bread
Bread 125
我不想使用 PHP 查询每个“事物”。我正在尝试运行一两个查询。
最佳答案
我不认为你能够像你展示的那样将它们完全放在单独的行中(除非你查看 ROLLUP
函数),但这可能不是必需的给你。
我认为您应该使用 GROUP_CONCAT
,它是一种类似于 SUM
的聚合函数,但它会创建一个由所有值组成的逗号分隔列表:
SELECT
*
SUM(sale_amount) as total_sales,
GROUP_CONCAT(item_name) as item_names
FROM customers c
JOIN sales s USING (customer_id)
JOIN sale_items si USING (sale_id)
JOIN stock_items sit USING (stock_item_id)
GROUP BY customer_id
您应该看到的示例行是:
Denver Doe Coffee,Milk,Bread,Bread 125
(我必须编写一些列名称,例如 sale_amount,但我敢肯定您必须在其中包含这些名称。您必须对这些名称进行一些调整,也许还需要对我进行连接的方式进行调整,但如果我了解您的需求,这应该可以进行一些更改。
关于mysql - 对多连接表求和,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50589370/