2017-08-29 14 views
1

小さなデータセットで金額を合計する方法を見つけようとしていますが、特定の行にしかありません。このデータは、変更できない別のシステムから抽出されます。これは、SQLへの1回限りのデータのインポートに使用されるので、きれいで効率的です。特定の人物IDが同じイベントコードに対して複数の支払いを行った行を合計する必要があります。特定の行のみを集計するSQL

このデータでは、AmountPaidとDatePaidを除いて、支払人のすべての列(多くは図示せず)は同じです。私はAmountPaidをSUMにしたい(そして可能ならばDatePaidのMAXを得る)。

データは次のようになります。

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 

私は何をする必要があることPerson123によって作らEventAの合計だけの支払いである - 合計$ 100(+ 50 50)ので、私は1つの支払取引としてこれをインポートすることができなければなりません。これを希望

理想の結果:

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

を働く可能性のあるすべての列を選択するには、それが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

私たちにはこの勝者があります。ありがとうございました!私の担当者のポイントは低く、アップヴォートが隠されていることを示しています。 – 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

関連する問題