2017-08-29 103 views
1

我試圖找到一種方法來總和一個小數據集中的美元金額,但僅限於某些行。這些數據是從另一個我無法更改的系統中提取的。這將用於一次性將數據導入到SQL中,因此漂亮且高效的優先級較低。我需要總結特定人員ID爲相同事件代碼進行兩次或多次付款的行。SQL僅SUM某些行

在數據中,付款人的所有列(許多未顯示)與AmountPaid和DatePaid除外相同。我想SUM AmountPaid(如果可能的話獲得MAX的DatePaid)。

的數據是這樣的:

EventCode | PersonID | DatePaid | AmountPaid 
****  
EventA | Person123 |2017-01-01 | $50 
EventA | Person456 |2017-02-01 | $100 
EventA | Person123 |2017-02-02 | $50 
EventB | Person123 |2016-01-01 | $100 
EventC | Person456 |2017-07-07 | $200 
EventC | Person123 |2017-08-08 | $200 

我需要做的是總只是EventA通過Person123支付的款項 - 總應$ 100(50 + 50),這樣我就可以導入此作爲一個支付交易。

理想的結果會是這樣的:

EventCode | PersonID | DatePaid | AmountPaid 
****  
EventA | Person456 |2017-02-01 | $100 
EventA | Person123 |2017-02-02 | $100 
EventB | Person123 |2016-01-01 | $100 
EventC | Person456 |2017-07-07 | $200 
EventC | Person123 |2017-08-08 | $200 

感謝,

+0

那麼你需要返回所有更多的列或不是?如果您想要完整的答案,最好包含所有必要的信息,以便爲您提供完整的解決方案。 –

+0

通過使用personID –

+0

組是的我需要返回所有列。從提取的數據創建的表格中有132列,有點長,試圖包括在這裏。 'Person123'和'EventA'的其他列除了DatePaid和AmountPaid外都是相同的。沒有可用於鏈接條目的事務標識符。 – Area51Resident

回答

1

如果您有更多的列在表中你在評論中提到,它是一個時間tassk,您可以嘗試以下

SELECT DISTINCT 
    EventCode, 
    PersonID, 
    DatePaid = (SELECT MAX(DatePaid) FROM YourTable t2 WHERE t1.EventCode = t2.EventCode AND t1.PersonID = t2.PersonID) , 
    AmountPaid= (SELECT SUM(AmountPaid) FROM YourTable t2 WHERE t1.EventCode = t2.EventCode AND t1.PersonID = t2.PersonID) 
    //select other 100+ columns 
FROM YourTable t1 
+0

我們有這個的贏家。謝謝!我的代表點很低顯示我的upvote是隱​​藏的。 – Area51Resident

1

試試這個,這是什麼回報你?

Select 
    SQ.ID 
    ,SQ.EventCode 
    ,SQ.PersonID 
    ,SQ.Datepaid 
    ,SUM(SQ.Amountpaid) 
    ,MAX(SQ.Amountpaid) 

    From 
    (
    Select 
    Cast(EventCode As Varchar(20)) +'-'+Cast(PersonID As Varchar(20)) +'-'+Cast(DatePaid As Varchar(20)) AS 'ID' 
    ,EventCode 
    ,PersonID 
    ,Datepaid 
    ,AmountPaid 
    From [TableNAme] 
    Group By 
    Cast(EventCode As Varchar(20)) +'-'+Cast(PersonID As Varchar(20)) +'-'+Cast(DatePaid As Varchar(20)) 
    ,EventCode 
    ,PersonID 
    ) As SQ 

Group By 
    SQ.ID 
    ,SQ.EventCode 
    ,SQ.PersonID 
    ,SQ.Datepaid 

要選擇所有列在下面可以爲你工作,而不是

Select 
* 
    ,SUM(SQ.Amountpaid) 
    ,MAX(SQ.Amountpaid) 

    From 
    (
    Select * 
    ,Cast(EventCode As Varchar(20)) +'-'+Cast(PersonID As Varchar(20)) +'-'+Cast(DatePaid As Varchar(20)) AS 'ID' 
    From [TableNAme] 
    Group By 
    Cast(EventCode As Varchar(20)) +'-'+Cast(PersonID As Varchar(20)) +'-'+Cast(DatePaid As Varchar(20)) 
    ,EventCode 
    ,PersonID 
    ) As SQ 

Group By 
    SQ.ID 
    ,SQ.EventCode 
    ,SQ.PersonID 
    ,SQ.Datepaid 
+0

似乎缺少DatePaid列。 –

+0

我用子查詢修改了它,現在能工作嗎? – PeterH

+0

我認爲它現在應該工作:s – PeterH