我正在编写一个查询,其中我应该按月折扣减去总收入。问题是有多个代码代表收入或折扣。
为了说明我的意思,请参阅以下示例。
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',但没有任何东西可以加入它,那将会有效。
答案 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