如何从具有不同行数的两个单独的MS SQL查询中添加两列

时间:2014-03-05 22:56:34

标签: sql sql-server

我有两个Microsoft SQL查询,它们都提供两列但行数不同。结果如下:

首先查询:

ProductID, Inventory
1, 100
2, 50
3, 200

第二次查询:

ProductID, Sales
1, -20
2, -50

我想得到以下输出:

ProductID, BalanceInventory
1, 80
2, 0
3, 200

我尝试在查询中使用加号,如下所示:

Select t1.ProductID, 
       t1.Inventory + (Case when t2.Sales is null then 0 else t2.Sales end) as 'BalanceInventory' 
  from t1 full join t2 on t1.ProductID = t2.ProductID

这个问题是数据库结构的设计方式是销售和库存不能在同一个查询中运行。 因此,我需要运行两个单独的查询,然后为每个ProductID 添加两列Inventory和Sales。

实际的数据库结构和查询要复杂得多。我试图通过创建一个假设的问题来简化问题。

请帮忙。这吃了我的头。

谢谢, 卡兰

3 个答案:

答案 0 :(得分:1)

试试这个

select ProductID, (inv.Inventory + s.Sales) as BalanceInventory
from
( 
    select  ProductID, Inventory
    from [table]
    where xxx
) inv
left outer join
(
   select  ProductID, Sales 
    from [table]
    where xxx
) s on (s.ProductID = inv.ProductID)

答案 1 :(得分:1)

另一个选项是

SELECT UnionTable.ProductID, SUM(UnionTable.BalanceInventory) AS BalanceInventory
FROM (
    SELECT ProductID, Inventory As BalanceInventory
    FROM Table1
    UNION ALL
    SELECT ProductID, Sales As BalanceInventory
    FROM Table2
) As UnionTable
GROUP BY UnionTable.ProductID

要减去而不是添加,只需使一部分为负:

SELECT UnionTable.ProductID, SUM(UnionTable.BalanceInventory) AS BalanceInventory
FROM (
    SELECT ProductID, Inventory As BalanceInventory
    FROM Table1
    UNION ALL
    SELECT ProductID, -Sales As BalanceInventory
    FROM Table2
) As UnionTable
GROUP BY UnionTable.ProductID

答案 2 :(得分:0)

您可以使用“isNull(expr,0)”来避免使用case表达式。

关于您的问题,如果您不能在查询中使用任何JOIN,请尝试使用UNION运算符: http://technet.microsoft.com/en-us//library/ms180026.aspx