带计算的三个表的SQL查询
我被问到一个面试问题,我无法解决。我不在SQL领域,更多的是展示解决问题的能力,而不是SQL能力。不过我还是想弄明白 它位于MS SQL server中,但一般SQL答案是可以接受的 我有3个表:Sales、Customers、Products,表中没有空值 客户:客户ID、客户名称 产品:产品ID、产品价格 销售:客户ID、产品ID、购买数量 他们希望我把支付最多的客户展示给支付最少的客户 因此,我需要将客户ID与销售中的客户ID联系起来,然后将销售与产品价格联系起来,计算出购买的价格*编号,并将其分配给正确的人 当时我试过这样的方法:(显然是错的)带计算的三个表的SQL查询,sql,sql-server,Sql,Sql Server,我被问到一个面试问题,我无法解决。我不在SQL领域,更多的是展示解决问题的能力,而不是SQL能力。不过我还是想弄明白 它位于MS SQL server中,但一般SQL答案是可以接受的 我有3个表:Sales、Customers、Products,表中没有空值 客户:客户ID、客户名称 产品:产品ID、产品价格 销售:客户ID、产品ID、购买数量 他们希望我把支付最多的客户展示给支付最少的客户 因此,我需要将客户ID与销售中的客户ID联系起来,然后将销售与产品价格联系起来,计算出购买的价格*编号,
显然我不擅长SQL,但如果有人能帮我朝着正确的方向解决这个问题(几小时后就要进行第二次面试了!),我会非常感激!我把自己弄得筋疲力尽 如果您希望列表从支付最多到支付最少排序,请添加:
ORDER BY SUM(Sales.Number_Purchased * Products.Product_Price) DESC
此外,由于没有在表之间建立正确的连接,因此必须更改一些连接条件
由于您是在MS-ACCESS中执行此操作的,因此必须用括号括起连接
应该是:
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
如果要将列表从支付最多到支付最少排序,请添加:
ORDER BY SUM(Sales.Number_Purchased * Products.Product_Price) DESC
此外,由于没有在表之间建立正确的连接,因此必须更改一些连接条件
由于您是在MS-ACCESS中执行此操作的,因此必须用括号括起连接
应该是:
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
我更愿意用以下步骤来解决这个问题 首先,找出所有客户每次购买的总数
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
最后,您可以通过对账单进行排序,找出支付最多和最少的人
请注意,在代码中不允许使用Products.Customer\u ID,因为Customer\u ID不是Products表中的列之一
编辑
哎呀,在我的第二个SQL中有一个模棱两可的列。它应该是“SELECT Customers.Customer\u ID”,因为列名称Customer\u ID在两个不同的表中使用。我希望通过以下步骤来解决这个问题 首先,找出所有客户每次购买的总数
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
最后,您可以通过对账单进行排序,找出支付最多和最少的人
请注意,在代码中不允许使用Products.Customer\u ID,因为Customer\u ID不是Products表中的列之一
编辑
哎呀,在我的第二个SQL中有一个模棱两可的列。它应该是“SELECT Customers.Customer\u ID”,因为列名称Customer\u ID在两个不同的表中使用。男孩,如果我站在你的立场上,有一半的时间不允许在数据库中规范化表:( 我很快找到的任何人,请原谅语法错误。但你会明白:
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
无法检查,但基本上你是对的,但不在连接上
内部连接只会得到匹配的结果。但是那些没有带来任何东西的用户呢?他们不会出现在销售部分,所以他们不会出现在您的结果中,这在我的工作中是一件坏事,因为他们希望看到所有的客户。
这允许您收回所有的销售记录,然后如果需要,过滤掉空销售记录。
通常情况下,最好是零价值,然后你可以提供关于没有消费的客户的信息。(添加的信息使他们感到高兴;)
因此,使用左连接,无论花费多少,您都可以获得每个客户。
将其与产品匹配记住,您希望保留所有销售,并确保没有丢失数据的问题,请使用另一个左键。
然后真的只是使用一个订单,然后完成
希望这能帮上忙,小子,如果我站在你的立场上,有一半的时间是不允许在数据库中规范化表格的:( 我很快找到的任何人,请原谅语法错误。但你会明白:
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
无法检查,但基本上你是对的,但不在连接上
内部连接只会得到匹配的结果。但是那些没有带来任何东西的用户呢?他们不会出现在销售部分,所以他们不会出现在您的结果中,这在我的工作中是一件坏事,因为他们希望看到所有的客户。
这允许您收回所有的销售记录,然后如果需要,过滤掉空销售记录。
通常情况下,最好是零价值,然后你可以提供关于没有消费的客户的信息。(添加的信息使他们感到高兴;)
因此,使用左连接,无论花费多少,您都可以获得每个客户。
将其与产品匹配记住,您希望保留所有销售,并确保没有丢失数据的问题,请使用另一个左键。
然后真的只是使用一个订单,然后完成
希望这有帮助你错过了两件事。 A) 表之间的链接不正确。跟随键列是有用的练习 B) 正如Filipe指出的那样,ORDERBY子句进行排序
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
你错过了两件事。 A) 表之间的链接不正确。跟随键列是有用的练习 B) 正如Filipe指出的那样,ORDERBY子句进行排序
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
据我所知,这些客户相互出售商品。因此,应该有另一个表或另一个字段来定义哪个产品属于哪个客户。有时候他们会问问题而不是答案。对不起,我应该假设公司正在进行销售。每个客户从同一家公司购买不同的产品。他们不互相出售。我认为