【问题标题】:Sql query to fetch multiple data from multiple tablesSql查询从多个表中获取多个数据
【发布时间】:2020-11-29 21:37:06
【问题描述】:

给定以下表格:

• 客户(ClientId、姓名、姓氏、年龄)

• 产品(ProductId、名称、价格)

• 购买(Purchaseld、Date、ClientId、Productid)

我需要编写一个 SQL 查询来显示客户购买的数量。它只能显示购买超过 1 次的客户。结果应包含以下字段:全名(即“john rambo”)、购买数量。

我已编写此查询,但结果不正确

SELECT Concat(clients.name, clients.surname) 
FROM   clients 
       JOIN products 
         ON clients.name = products.name 
       JOIN purchases 
         ON products.productid = purchases.productid 
GROUP  BY clientid 
HAVING Count(clientid) > 1 

【问题讨论】:

  • 你看到了什么而不是你期望的?
  • clients.name = products.name 这看起来很奇怪
  • 我已经写了这个查询,但结果不正确 您的查询在其主要状态(在 M Khalid Junaid 的版本之前)可以产生的唯一结果是“语法错误”。
  • 你能提供一个db-fiddle.com 吗?这样我们就可以轻松地使用您的数据。
  • Products 不需要在描述的任务中使用。加入ClientsPurchases(使用正确的列加入),按客户分组并计算购买量(不是客户)。

标签: mysql sql


【解决方案1】:
SELECT Concat(clients.name, ' ', clients.surname),
       count(*) as number_of_orders
FROM   clients 
       JOIN purchases 
         ON products.productid = purchases.productid 
GROUP  BY Concat(clients.name, ' ', clients.surname) 
HAVING Count(clientid) > 1 

正如 cmets 中所述,您加入产品没有多大意义 - 您要求仅返回与客户名字匹配的产品的记录。

CONCAT 会将两个字段粘合在一起(例如“JohnRambo”)

【讨论】:

  • SELECT Concat(clients.name, ' ', clients.surname), count(*) as number_of_orders FROM clients JOIN purchase ON Clients.clientid=Purchases.clientid GROUP BY clientid HAVING Count(clientid) > 1
【解决方案2】:

它必须只显示购买超过 1 次的客户。

您的问题没有提及产品,因此查询中不需要:

SELECT CONCAT(c.name, c.surname) 
FROM clients c JOIN
     purchases p
     ON p.ClientId = c.ClientId 
GROUP  BY c.ClientId, CONCAT(c.name, c.surname) 
HAVING COUNT(*) > 1 ;

请注意,ClientId 可能唯一地定义了客户端,而不是名称。所以ClientId 应该是聚合的一部分。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-03-13
    • 2018-12-22
    • 2017-03-22
    相关资源
    最近更新 更多