Sql server SQL将查询一行与两个筛选列连接起来
我使用的是Sql server SQL将查询一行与两个筛选列连接起来,sql-server,tsql,join,Sql Server,Tsql,Join,我使用的是WorldWideImportersMicrosoft示例数据库表。我试图返回的行是具有列的客户,这些列将显示其2014年、2015年的总销售额,以及各自列中的两个总销售额。我不允许使用任何类型的子查询 对于这个问题,我试图这样解决: SELECT C.CustomerID ,C.CustomerName ,ISNULL(SUM(OL.Quantity * OL.UnitPrice), 0.00) AS [2014Sales] ,ISNULL(SUM
WorldWideImporters
Microsoft示例数据库表。我试图返回的行是具有列的客户,这些列将显示其2014年、2015年的总销售额,以及各自列中的两个总销售额。我不允许使用任何类型的子查询
对于这个问题,我试图这样解决:
SELECT C.CustomerID
,C.CustomerName
,ISNULL(SUM(OL.Quantity * OL.UnitPrice), 0.00) AS [2014Sales]
,ISNULL(SUM(OLP.Quantity * OLP.UnitPrice), 0.00) AS [2015Sales]
,ISNULL(SUM(OL.Quantity * OL.UnitPrice), 0.00)
+ ISNULL(SUM(OLP.Quantity * OLP.UnitPrice), 0.00) AS [TotalSales]
FROM Sales.Customers AS C
LEFT OUTER JOIN Sales.Orders AS O ON C.CustomerID = O.CustomerID
AND O.OrderDate BETWEEN '2014-01-01' AND '2014-12-31'
LEFT OUTER JOIN Sales.OrderLines AS OL ON O.OrderID = OL.OrderID
LEFT OUTER JOIN Sales.Orders AS OP ON O.CustomerID = C.CustomerID
AND O.OrderDate BETWEEN '2015-01-01' AND '2015-12-31'
LEFT OUTER JOIN Sales.OrderLines AS OLP ON OL.OrderID = O.OrderID
GROUP BY C.CustomerID
,C.CustomerName
ORDER BY TotalSales DESC, CustomerID;
选择C.CustomerID
,C.客户名称
,作为[2014年销售额]的ISNULL(总和(原数量*原单价),0.00)
,ISNULL(总和(OLP.数量*OLP.单价),0.00)为[2015年销售额]
,ISNULL(总和(OL.数量*OL.单价),0.00)
+ISNULL(总和(OLP.数量*OLP.单价),0.00)为[TotalSales]
来自销售。客户为C
左外联接销售。订单为C.CustomerID=O.CustomerID上的O
订单日期介于“2014-01-01”和“2014-12-31”之间
将Sales.OrderLines作为OL在O.OrderID=OL.OrderID上左外部联接
左外联接销售。订单作为O.CustomerID=C.CustomerID上的OP
订单日期介于“2015-01-01”和“2015-12-31”之间
左外部将Sales.OrderLines作为OLP连接到OL.OrderID=O.OrderID
按C.CustomerID分组
,C.客户名称
按TotalSales DESC、CustomerID排序的订单;
我很难理解加入。我有一些面向对象的经验,但我不能完全理解关系连接。我可以看到如何通过子查询解决这个问题,一个是2015年,一个是2014年
目前,我的查询正在无休止地运行,这意味着我两次尝试加入的方式一定是尝试合并太多的行组合。任何解释这里发生了什么以及如何解决我的问题的帮助都将不胜感激 编辑查询时,有些行没有意义: 您加入了相同的表,但没有在
ON
语句中指明它们的状态
请注意,您分别命名了Sales.Orders
和Sales.OrderLines
OP
和OLP
,但仍然使用标准O.CustomerID=C.CustomerID
和OL.OrderID=O.OrderID
LEFT OUTER JOIN Sales.OrderLines AS OL ON O.OrderID = OL.OrderID
LEFT OUTER JOIN Sales.Orders AS OP ON O.CustomerID = C.CustomerID
AND O.OrderDate BETWEEN '2015-01-01' AND '2015-12-31'
LEFT OUTER JOIN Sales.OrderLines AS OLP ON OL.OrderID = O.OrderID
谢谢你的澄清。我收到错误“多标识符无法绑定到前两个选项上,然后[2015Sales]上的列名无效”。有没有一种方法可以在没有union all的情况下实现这一点?我还没有了解到这一点,所以一定有一种方法可以使用just join。谢谢。我试图更正你的加入条件,但它根本不起作用。你确定你不能使用任何子查询吗?是的,我确定它明确说明我不能使用子查询。这就是为什么我现在很难使用子查询的原因很好。哇,它似乎和你发布的那些加入标准修复程序一起工作。谢谢你的帮助!它们看起来不同,对我来说也很准确! SELECT C.CustomerID ,C.CustomerName ,ISNULL(SUM(OL.Quantity * OL.UnitPrice), 0.00) AS [2014Sales] ,ISNULL(SUM(OLP.Quantity * OLP.UnitPrice), 0.00) AS [2015Sales] ,ISNULL(SUM(OL.Quantity * OL.UnitPrice), 0.00) + ISNULL(SUM(OLP.Quantity * OLP.UnitPrice), 0.00) AS [TotalSales] FROM Sales.Customers AS C LEFT OUTER JOIN Sales.Orders AS O ON C.CustomerID = O.CustomerID AND CONVERT(date, O.OrderDate) BETWEEN '2014-01-01' AND '2014-12-31' LEFT OUTER JOIN Sales.OrderLines AS OL ON O.OrderID = OL.OrderID LEFT OUTER JOIN Sales.Orders AS OP ON C.CustomerID = OP.CustomerID AND CONVERT(date, OP.OrderDate) BETWEEN '2015-01-01' AND '2015-12-31' LEFT OUTER JOIN Sales.OrderLines AS OLP ON OP.OrderID = OLP.OrderID GROUP BY C.CustomerID ,C.CustomerName ORDER BY [TotalSales] DESC, CustomerID; SELECT [2014].CustomerID ,[2014].CustomerName ,[2014Sales] ,[2015Sales] ,[2014Sales] + [2015Sales] AS [TotalSales] FROM ( (SELECT C.CustomerID ,C.CustomerName ,ISNULL(SUM(OL.Quantity * OL.UnitPrice), 0.00) AS [2014Sales] FROM Sales.Customers AS C LEFT OUTER JOIN Sales.Orders AS O ON C.CustomerID = O.CustomerID LEFT OUTER JOIN Sales.OrderLines AS OL ON O.OrderID = OL.OrderID WHERE O.OrderDate BETWEEN '2014-01-01' AND '2014-12-31' GROUP BY C.CustomerID ,C.CustomerName) AS [2014] LEFT OUTER JOIN (SELECT C2.CustomerID ,C2.CustomerName ,ISNULL(SUM(OLP.Quantity * OLP.UnitPrice), 0.00) AS [2015Sales] FROM Sales.Customers AS C2 LEFT OUTER JOIN Sales.Orders AS OP ON OP.CustomerID = C2.CustomerID LEFT OUTER JOIN Sales.OrderLines AS OLP ON OP.OrderID = OLP.OrderID WHERE OP.OrderDate BETWEEN '2015-01-01' AND '2015-12-31' GROUP BY C2.CustomerID ,C2.CustomerName) AS [2015] ON [2014].CustomerID = [2015].CustomerId ORDER BY [2014Sales] + [2015Sales] DESC, CustomerID;