Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/file/3.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 server 按年度查询客户、采购总值和给予客户的总折扣_Sql Server_Tsql_Ssms - Fatal编程技术网

Sql server 按年度查询客户、采购总值和给予客户的总折扣

Sql server 按年度查询客户、采购总值和给予客户的总折扣,sql-server,tsql,ssms,Sql Server,Tsql,Ssms,我正在使用Northwind数据库。我想写一个查询,显示客户、购买的总价值以及每年给客户的总折扣。我想展示1996年、1997年、1998年的所有客户 下面是我正在使用的表格 SELECT TOP (1000) [CustomerID] ,[CompanyName] ,[ContactName] ,[ContactTitle] ,[Address] ,[City] ,[Region] ,[PostalCode]

我正在使用Northwind数据库。我想写一个查询,显示客户、购买的总价值以及每年给客户的总折扣。我想展示1996年、1997年、1998年的所有客户

下面是我正在使用的表格

SELECT TOP (1000) [CustomerID]
      ,[CompanyName]
      ,[ContactName]
      ,[ContactTitle]
      ,[Address]
      ,[City]
      ,[Region]
      ,[PostalCode]
      ,[Country]
      ,[Phone]
      ,[Fax]
  FROM [Northwind].[dbo].[Customers]

SELECT TOP (1000) [OrderID]
      ,[CustomerID]
      ,[EmployeeID]
      ,[OrderDate]
      ,[RequiredDate]
      ,[ShippedDate]
      ,[ShipVia]
      ,[Freight]
      ,[ShipName]
      ,[ShipAddress]
      ,[ShipCity]
      ,[ShipRegion]
      ,[ShipPostalCode]
      ,[ShipCountry]
  FROM [Northwind].[dbo].[Orders]

SELECT TOP (1000) [OrderID]
      ,[ProductID]
      ,[UnitPrice]
      ,[Quantity]
      ,[Discount]
  FROM [Northwind].[dbo].[Order Details]
以下是我写的问题:

SELECT  o.customerID, year(o.OrderDate) as Year,
        sum(od.UnitPrice * od.Quantity) as Total_value_of_purchase, 
        sum(od.UnitPrice * od.Quantity * od.Discount) as Total_discount_received,
        sum((od.UnitPrice * od.Quantity)-(od.UnitPrice * od.Quantity * od.Discount)) as Total_after_discount
FROM Customers as c
cross JOIN Orders as o

left outer join [Order Details] as od
on o.OrderID=od.OrderID

GROUP BY o.CustomerID, Year(o.OrderDate)
order by o.CustomerID, Year(o.OrderDate)
这是我得到的结果的图片

您可以注意到,在某些情况下,客户可能不会每年都订购,所以我只得到234个结果。是否有任何方法可以显示所有客户和所有3年?因此,如果我有91个客户,结果将显示91*3=273个结果


你能给我提供一些指导或帮助吗?这样我就可以按照你的建议来解决这个问题了。

我有一些最新消息。我试着使用union

SELECT c.CustomerID, y.YR,
        sum(od.UnitPrice * od.Quantity) as Total_value_of_purchase, 
        sum(od.UnitPrice * od.Quantity * od.Discount) as Total_discount_received,
        sum((od.UnitPrice * od.Quantity)-(od.UnitPrice * od.Quantity * od.Discount)) as Total_after_discount
FROM (SELECT 1996 YR UNION ALL SELECT 1997 UNION ALL SELECT 1998) y(YR)
CROSS JOIN Customers c
LEFT OUTER JOIN Orders o ON c.CustomerID = o.CustomerID
LEFT OUTER JOIN [Order Details] od ON o.OrderID = od.OrderID
GROUP BY c.CustomerID, y.YR
ORDER BY c.CustomerID, y.YR
结果是:

我确实得到了273个结果,但不是给我每年的总数,而是给了我所有年份的总数

有什么建议吗

附言:我这样做不是为了作业。我真的很想找到解决办法