为两个查询中的每一行增加一列



我有两个查询,分别给出客户购买的工作单元数量和消耗的工作单元的数量。

我正在开发SQL Server 2014

WUBought查询返回如下示例:

Customer    Year    Month   UnitBought
Cust1       2015    6       50
Cust2       2014    7       100
Cust1       2013    10      30
Cust3       2015    2       40

另一个查询返回客户端使用的号码:

Customer    Year    Month   UnitConsumed
Cust1       2015    2       6
Cust1       2015    5       20
Cust2       2015    3       8
Cust1       2015    4       3
Cust3       2015    2       10

我基本上想做的是,把每个月的购买量减去消耗量。以下是我想要的Cust1:前六个月的结果示例

Customer    Year    Month   Remaining
Cust1       2015    1       30
Cust1       2015    2       24
Cust2       2015    3       24
Cust1       2015    4       21
Cust3       2015    5       1
Cust3       2015    6       51

该查询从每月列出的表中返回使用UNION ALL购买的WU,以在没有值的情况下获得每月:

SELECT Customer, [Year], [Month], SUM(UOBought) AS UORest
    FROM WU_Bought
    GROUP BY [Customer], [PurchaseDate]
UNION ALL
SELECT '' AS Customer, [Year], [Month], '' AS UORest
    FROM  Months
    GROUP BY [Year], [Month]

以下是每个月购买的每个单元的总和查询,使用相同的联合语句:

SELECT Customer, [Year], [Month], SUM(TotalConsumed) * -1 AS UORest
    FROM WUConsumed
    GROUP BY Customer, Year, Month
UNION ALL
SELECT '' AS Customer, [Year], [Month], '' AS UORest
    FROM EveryMonths
    GROUP BY Year, Month

现在我想我必须调整第一个,迫使它保持之前的总和,但我不确定我该怎么做。

这对你有用吗?

SELECT b.customer_id, b.year, b.month, SUM(b.units_bought) AS units_bought, ISNULL(c.units_consumed,0) AS units_consumed, SUM(b.units_bought) - ISNULL(c.units_consumed,0) AS units_remaining
    FROM Bought b
    LEFT JOIN Consumed c
        ON b.customer_id = c.customer_id AND b.year = c.year AND b.month = c.month
GROUP BY b.customer_id, b.year, b.month

好的,我开始工作了。

我所做的非常"简单",使用了自2012年起提供的SQL Server功能:前面的无界行

这里有一篇关于这个功能的非常清晰的文章。

我创建了另一个视图,用UNION ALL子句对消耗和购买单位的查询结果进行分组,称为"WU_Closing_view",然后在其中使用ROWS UNBOUNDED PREEDING:

SELECT Customer, Year, Month, SUM(Closing) OVER(PARTITION BY Customer ORDER BY Year, Month ROWS UNBOUNDED PRECEDING) AS Closing
    FROM WU_Closing_View
    GROUP BY Customer, Year, Month, Closing
UNION ALL
SELECT     '' AS Customer, Year, Month, '' AS Sum_bought
    FROM         Months
    GROUP BY Year, Month
    ORDER BY Customer, Year, Month

请注意,我使用了PARTITION BY,以便按客户端求和。因为我想在SSRS矩阵中显示每个月,所以我添加了一个"UNION ALL",指向一个空客户的表,该表上有从2010年到2017年的每个年份和月份。但如果你不需要每个月都进行进化,这是可选的。

也许有一种更简单的方法,但这就是我迄今为止找到的方法。

最新更新