如何每月减去同一列的2个不同分组的总数

时间:2016-02-09 21:52:21

标签: sql group-by sql-server-2008-r2 sum

我正在编写一个查询,其中我应该按月折扣减去总收入。问题是有多个代码代表收入或折扣。

为了说明我的意思,请参阅以下示例。

 Month       Code         Amount
 May         4001         $50.05
 May         4002         $49.95
 May         6005         $15.00
 May         6006         $5.00
 March       4003         $65.00

收入代码为4001,4002和4003.折扣为6005和6006。

最后我应该看到:

 Month       TotalRevenue      TotalDiscount       Total
 May         $100.00           $20.00              $80.00
 March       $65.00            $0.00               $65.00

我试过CASE,但它告诉我我只能使用1个参数。我也尝试在select语句中创建一个子查询,但我似乎无法使用2个SUM语句(1个在main中,1个在sub中)。我想如果我有可能使用'join',但没有任何东西可以加入它,那将会有效。

2 个答案:

答案 0 :(得分:1)

那么,第一个问题是构建您的查询,以便将折扣代码与收入代码区分开来。如果您有包含代码的表(一个组合代码表和一个用于区分两种类型的指示符,或单独的表),则应使用此表(或多个表)。

由于很难从你的问题中告诉全套代码,所以我们假装代码6000-6999是折扣而其他所有代码都是收入。然后,产生所需结果的查询可能如下所示:

select Month, 
Revenue = sum(
    case when Code between 6000 and 6999 then 
        0
    else
       Amount
    end
),
Discounts = sum(
    case when Code between 6000 and 6999 then 
        Amount
    else
       0
    end
),
Total = sum(
    case when Code between 6000 and 6999 then 
        -1 * Amount
    else
        Amount
    end
)
from MyTable
group by Month

根据您区分两种类型代码的实际标准,您只需更改case语句即可匹配,它应该有效。

答案 1 :(得分:0)

这应该让你非常接近所需的结果:

设置(如果在问题中提供,将非常感激:))

slot

查询:

-- drop table Code
create table Code
(
    Code INT,
    IsRevenue BIT
)

insert into Code VALUES (4001, 1), (4002, 1), (4003, 1), (6005, 0), (6006, 0)
GO

create table MonthData
(
    TheMonth VARCHAR(16),
    Code INT,
    Amount NUMERIC(18, 2)
)
GO

insert into MonthData values ('May', 4001, 50.05),  ('May', 4002, 49.95), 
     ('May', 6005, 15.00), ('May', 6006, 5.00), ('March', '4003', 65.00)
GO

select * from MonthData
GO