用于计算的三个表的SQL查询

时间:2013-12-03 12:07:40

标签: sql sql-server

我接受了一个面试问题,我无法解决。我不在SQL领域,而且更多的是展示解决问题的能力而不是SQL能力。我还是想知道它!

它位于MS SQL服务器中,但可以接受通用的SQL答案。

我有3个表:Sales,Customers,Products和表中的NO NULL值。

客户:Customer_ID,Customer_Name

产品:Product_ID,Product_Price

销售:Customer_ID,Product_ID,Number_Purchased

他们希望我向付费最少的客户展示付费最高的客户。

因此,我需要将客户的客户ID链接到销售中的客户ID,然后将销售额与产品价格相关联,并计算出已购买的Price * Number,并将其分配给正确的人。

我当时尝试过这样的事情:(显然是错的)

SELECT Customers.Customer_ID, Customers.Customer_Name, SUM(Sales.Number_Purchased *Products.Product_Price) as Total
FROM (Customers 
INNER JOIN Products 
ON Customers.Customer_ID = Products.Customer_ID)
INNER JOIN Sales ON 
Products.Product_ID = Sales.Product_ID
GROUP BY Customers.Customer_ID, Customers.Customer_Name

显然我对SQL并不擅长但是如果somone可以给我一个正确的方向来解决这个问题(第二次采访是在几个小时内!)我真的很感激!我已经把自己绑成了结。

4 个答案:

答案 0 :(得分:3)

如果您希望列表从付费最多到付款最少,请添加:

ORDER BY SUM(Sales.Number_Purchased * Products.Product_Price) DESC

此外,您必须更改某些JOIN条件,因为您没有在表之间建立正确的连接。

由于你在MS-ACCESS中这样做,你必须用括号

包裹JOINS

应该是:

SELECT Customers.Customer_ID, 
       Customers.Customer_Name,
       SUM(Sales.Number_Purchased * Products.Product_Price) AS Total
FROM ((Customers 
INNER JOIN Sales ON Sales.Customer_ID = Customers.Customer_ID)
INNER JOIN Products ON Sales.Product_ID = Products.Product_ID)
GROUP BY Customers.Customer_ID, Customers.Customer_Name
ORDER BY SUM(Sales.Number_Purchased * Products.Product_Price) DESC

答案 1 :(得分:2)

我希望通过以下步骤来解决这个问题。

首先,找出所有客户完成的每次购买的总数。

SELECT Customer_ID, SUM (Sales.Number_Purchased * Products.Product_Price)
FROM Sales
INNER JOIN Products ON Products.Product_ID = Sales.Product_ID
GROUP BY Customer_ID

然后我们想知道客户名称。所以我们将内部加入Customes表。

SELECT Customer_ID, Customer_Name, SUM (Sales.Number_Purchased * Products.Product_Price)
FROM Sales
INNER JOIN Products ON Products.Product_ID = Sales.Product_ID
INNER JOIN Customers ON Customers.Customer_ID = Sales.Customer_ID
GROUP BY Customer_ID

最后,您可以执行ORDER BY语句,找出付出最多且最少的人。

请注意,在您的代码中,Products.Customer_ID 不允许,因为Customer_ID不是Products表中的列之一。

修改 糟糕,我的第二个SQL中有一个含糊不清的列。它应该是“SELECT Customers.Customer_ID”,因为列名Customer_ID用于两个不同的表。

答案 2 :(得分:1)

男孩,我一直在你的鞋子里,有一半的时间不允许在数据库中规范化表:(

任何我很快看到的人都会原谅语法错误。但你会明白这个想法:

SELECT Customers.Customer_ID, 
    Customers.Customer_Name, 
    SUM(Sales.Number_Purchased *Products.Product_Price) as Total
FROM Customers
LEFT JOIN SALES
ON customers.customer_ID = Sales.Customer_ID
left JOIN Products
ON  Sales.productid = products.product_ID
Customers.Customer_ID, Customers.Customer_Name
GROUP BY Customers.Customer_ID, Customers.Customer_Name
ORDER BY SUM(Sales.Number_Purchased * Products.Product_Price) DESC

不能检查它,但基本上你是对的但不是加入。

内部联接只会获得匹配的结果。但是没有带来任何东西的用户呢?它们不会存在于销售部分中,因此它们不会存在于您的结果中,因为他们希望看到所有客户,所以我在工作中这是一件坏事。 这允许您撤回所有这些,然后如果需要,过滤掉空销售。 通常最好将它们归零,然后您可以提供未花费的客户的信息。 (添加信息使他们感到高兴;))

所以,使用左连接,无论花多少钱,你都会得到每个顾客。 然后将产品与产品相匹配,记住您要保留所有销售,并确保数据缺失没有问题,请使用另一个产品。 然后真的只是使用一个订单,并完成。

希望这会有所帮助

答案 3 :(得分:0)

你错过了两件事。 A)表之间的链接不正确。关键列之后是有用的练习 B)正如Filipe所指出的,ORDER BY子句进行了排序

SELECT 
  Customers.Customer_ID, Customers.Customer_Name, 
  SUM(Sales.Number_Purchased *Products.Product_Price) as Total
FROM Customers 
  -- connect sales to customers
  INNER JOIN Sales ON 
    ON Sales.Customer_ID = Customers.Customer_ID
  -- connect products to sales
 INNER JOIN Products 
   Products.Product_ID = Sales.Product_ID
-- group to deliver an aggregate
GROUP BY Customers.Customer_ID, Customers.Customer_Name
-- sort
ORDER BY SUM(Sales.Number_Purchased * Products.Product_Price) DESC