Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/77.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
带计算的三个表的SQL查询_Sql_Sql Server - Fatal编程技术网

带计算的三个表的SQL查询

带计算的三个表的SQL查询,sql,sql-server,Sql,Sql Server,我被问到一个面试问题,我无法解决。我不在SQL领域,更多的是展示解决问题的能力,而不是SQL能力。不过我还是想弄明白 它位于MS SQL server中,但一般SQL答案是可以接受的 我有3个表:Sales、Customers、Products,表中没有空值 客户:客户ID、客户名称 产品:产品ID、产品价格 销售:客户ID、产品ID、购买数量 他们希望我把支付最多的客户展示给支付最少的客户 因此,我需要将客户ID与销售中的客户ID联系起来,然后将销售与产品价格联系起来,计算出购买的价格*编号,

我被问到一个面试问题,我无法解决。我不在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

据我所知,这些客户相互出售商品。因此,应该有另一个表或另一个字段来定义哪个产品属于哪个客户。有时候他们会问问题而不是答案。对不起,我应该假设公司正在进行销售。每个客户从同一家公司购买不同的产品。他们不互相出售。我认为