2016-02-09 63 views
0

我正在編寫一個查詢,我應該通過每月折扣扣除總收入。問題是有多個代碼可以代表收入或折扣。如何扣除每月2列不同組的同一列的總計

爲了說明我的意思,請看下面的例子。

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 

我已經試過如此,但它告訴我我只能使用1個參數。我也嘗試在select語句中創建一個子查詢,但我似乎無法使用2 SUM語句(1中main和1中sub)。我想如果我有可能使用「連接」,但沒有什麼可以加入它,它就會起作用。

+1

向我們展示一些這些嘗試 – Mihai

+0

代碼列表有多大?只是上述5或還有更多? –

+0

有19個收入代碼和8個優惠代碼。 – SQLThis

回答

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語句來匹配,它應該工作。

0

這應該讓你很接近理想的結果:

設置

-- 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 

查詢(這將是真的,如果在這個問題:)提供讚賞):

SELECT TheMonth, 
    SUM((CASE WHEN C.IsRevenue = 1 THEN MD.Amount ELSE -MD.Amount END)) AS TotalRevenue 
FROM MonthData MD 
    JOIN Code C ON C.Code = MD.Code 
GROUP BY TheMonth