2016-12-07 18 views
0

私は現在、必要なデータがmonthly viewであるDataTableを持っています。私がしようとしているのは、このデータをActivationYear、ActivationQuarter、BranchYear、およびBranchQuarterでグループ化した四半期ごとのビューにグループ化することです。グループC#月間DataTable四半期

AmountFinancedとCurrentBalanceから最新の(四半期の最後の1ヶ月)値が必要です。ただし、四半期ごとに毎月の支払いのの合計が必要です。ここで

は、私が毎月持っているものの一例である:四半期ごとにグループ化されたとき

ActivationDate | CurrentBranchDate | AmountFinanced | Payments | CurrentBalance 
1/1/16   | 1/30/16   | $10,000   | $100  | $9,800 
1/1/16   | 2/29/16   | $10,000   | $0  | $9,900 
1/1/16*   | 3/31/16*   | $10,000*  | $2,000* | $7,800* 
1/1/16*   | 4/30/16*   | $10,000*  | $1,000* | $6,800* 
2/1/16   | 2/29/16   | $5,000   | $0  | $5,200 
2/1/16*   | 3/31/16*   | $5,000*   | $500* | $4,700* 
2/1/16*   | 4/30/16*   | $5,000*   | $200* | $4,500* 

はここ(*と上記の行は、私がCurrentBalanceに使用行です)望ましい結果だ:

ActivationY | ActivationQ | BranchY | BranchQ | AmountFinanced | Payments | CurrentBalance 
2016  | 1   | 2016 | 1  | $15,000  | $2,500 | $12,500 
2016  | 1   | 2016 | 2  | $15,000  | $1,200 | $11,300 

私はMonthlyテーブルをルーピングしようとしましたが、重複して不正確な合計を取得しているようです(例:$ 15,000のときに40,000ドルの資金を提供する資金調達済みの列をすべて追加します)。ここで

がjdwengの答えに基づいて更新されたコードです:

var testResults = monthlyTable.AsEnumerable() 
         .GroupBy(x => (x.Field<DateTime>("ActivationDate").Month - 1)/3) 
         .Select(x => new 
         { 
          ActivationYear = x.FirstOrDefault().Field<DateTime>("ActivationDate").Year, 
          ActivationQuarter = ((x.FirstOrDefault().Field<DateTime>("ActivationDate").Month - 1)/3) + 1, 
          BranchYear = x.FirstOrDefault().Field<DateTime>("CurrentBranchDate").Year, 
          BranchQuarter = ((x.FirstOrDefault().Field<DateTime>("CurrentBranchDate").Month - 1)/3) + 1, 
          AmountFinanced = x.OrderByDescending(y => y.Field<DateTime>("CurrentBranchDate")).Select(y => y.Field<decimal>("AmountFinanced")).FirstOrDefault(), 
          CurrentBalance = x.OrderByDescending(y => y.Field<DateTime>("CurrentBranchDate")).Select(y => y.Field<decimal>("CurrentBalance")).FirstOrDefault(), 
          Sum_of_Payments = x.Sum(y => y.Field<decimal?>("Payments")) 
         }).ToList(); 

私はまだ間違ったAmountFinancedとCurrentBalanceを取得しています。 CurrentBranchDateをグループ化する必要がありますか?あなたはそれがために生成するデータを見れば

var quarterResults = monthlyTable.AsEnumerable() 
        //.GroupBy(x => (x.Field<DateTime>("ActivationDate").Month - 1)/3) 
        //.GroupBy(x => new { ActivationMonth = (x.Field<DateTime>("ActivationDate").Month - 1)/3, ActivationYear = x.Field<DateTime>("ActivationDate").Year }) 
        .GroupBy(x => new { ActivationQuarter = (x.Field<DateTime>("ActivationDate").Month - 1)/3, ActivationYear = x.Field<DateTime>("ActivationDate").Year, BranchQuarter = (x.Field<DateTime>("CurrentBranchDate").Month - 1)/3, BranchYear = x.Field<DateTime>("CurrentBranchDate").Year }) 
        .Select(x => new[] 
        { 
         x.FirstOrDefault().Field<DateTime>("ActivationDate").Year, 
         ((x.FirstOrDefault().Field<DateTime>("ActivationDate").Month - 1)/3) + 1, 
         x.FirstOrDefault().Field<DateTime>("CurrentBranchDate").Year, 
         ((x.FirstOrDefault().Field<DateTime>("CurrentBranchDate").Month - 1)/3) + 1, 
         x.OrderByDescending(y => y.Field<DateTime>("CurrentBranchDate")).Select(y => y.Field<decimal>("AmountFinanced")).FirstOrDefault(), 
         x.OrderByDescending(y => y.Field<DateTime>("CurrentBranchDate")).Select(y => y.Field<decimal>("CurrentBalance")).FirstOrDefault(), 
         x.OrderByDescending(y => y.Field<DateTime>("CurrentBranchDate")).Select(y => y.Field<decimal> 
         x.Sum(y => y.Field<decimal?>("Payments")) 
        }).ToArray(); 

@jdwengは、ここで私が使用していたデータさ:

dt.Rows.Add(new object[] { DateTime.Parse("11/01/2016"), DateTime.Parse("11/30/2017"), 57000, 0, 53639.4 }); 
dt.Rows.Add(new object[] { DateTime.Parse("01/01/2017"), DateTime.Parse("11/30/2017"), 52000, 0, 52000 }); 
dt.Rows.Add(new object[] { DateTime.Parse("03/01/2017"), DateTime.Parse("11/30/2017"), 28000, 0, 27160.82 }); 
dt.Rows.Add(new object[] { DateTime.Parse("04/01/2017"), DateTime.Parse("04/30/2017"), 77200, 0, 76190.96 }); 
dt.Rows.Add(new object[] { DateTime.Parse("04/01/2017"), DateTime.Parse("05/31/2017"), 77200, 0, 76190.96 }); 
dt.Rows.Add(new object[] { DateTime.Parse("04/01/2017"), DateTime.Parse("06/30/2017"), 77200, 0, 76190.96 }); 
dt.Rows.Add(new object[] { DateTime.Parse("06/01/2017"), DateTime.Parse("06/30/2017"), 98450, 0, 98450 }); 
dt.Rows.Add(new object[] { DateTime.Parse("04/01/2017"), DateTime.Parse("07/31/2017"), 77200, 0, 76190.96 }); 
dt.Rows.Add(new object[] { DateTime.Parse("04/01/2017"), DateTime.Parse("08/31/2017"), 77200, 0, 76190.96 }); 
dt.Rows.Add(new object[] { DateTime.Parse("04/01/2017"), DateTime.Parse("09/30/2017"), 77200, 0, 76190.96 }); 
dt.Rows.Add(new object[] { DateTime.Parse("06/01/2017"), DateTime.Parse("07/31/2017"), 98450, 0, 98450 }); 
dt.Rows.Add(new object[] { DateTime.Parse("06/01/2017"), DateTime.Parse("08/31/2017"), 98450, 0, 98450 }); 
dt.Rows.Add(new object[] { DateTime.Parse("06/01/2017"), DateTime.Parse("09/30/2017"), 98450, 0, 98450 }); 
dt.Rows.Add(new object[] { DateTime.Parse("04/01/2017"), DateTime.Parse("10/31/2017"), 77200, 0, 76190.96 }); 
dt.Rows.Add(new object[] { DateTime.Parse("04/01/2017"), DateTime.Parse("11/30/2017"), 77200, -1947.7, 74616.01 }); 
dt.Rows.Add(new object[] { DateTime.Parse("06/01/2017"), DateTime.Parse("10/31/2017"), 98450, 0, 98450 }); 
dt.Rows.Add(new object[] { DateTime.Parse("06/01/2017"), DateTime.Parse("11/30/2017"), 98450, 0, 98450 }); 
dt.Rows.Add(new object[] { DateTime.Parse("08/01/2017"), DateTime.Parse("08/31/2017"), 20000, 0, 20000 }); 
dt.Rows.Add(new object[] { DateTime.Parse("08/01/2017"), DateTime.Parse("09/30/2017"), 20000, 0, 20000 }); 
dt.Rows.Add(new object[] { DateTime.Parse("08/01/2017"), DateTime.Parse("10/31/2017"), 20000, -1631.58, 18540.78 }); 
dt.Rows.Add(new object[] { DateTime.Parse("08/01/2017"), DateTime.Parse("11/30/2017"), 20000, 0, 18540.78 }); 
dt.Rows.Add(new object[] { DateTime.Parse("10/01/2017"), DateTime.Parse("10/31/2017"), 25000, -509.55, 24490.45 }); 
dt.Rows.Add(new object[] { DateTime.Parse("10/01/2017"), DateTime.Parse("11/30/2017"), 25000, 0, 24490.45 }); 

をここでは、私が呼んでいる修正項目ですActivationYear 2017、ActivationQuarter 2、BranchYear 2017、BranchQuarter 2それは私に175,650(77,200 + 98,450)を与えるべき資金として77,200を私に与えます。

+0

を試してみては、これまで私たちにあなたが持っているコードを表示するので、我々は問題を見つけることができるかもしれません。メモリ内でグループ化するのではなく、データベースから四半期ごとにグループ化したデータをクエリするオプションがありますか? obtw、ぼかしは安全なデータ保護ではありません。 – dlatikay

+0

私は1分以内にコードを投稿します。すべてのデータはテストデータですが、私は例のためにそれをぼかしています。私が支払いを正確に合計することができれば、残りは同じになります。 – ferensilver

+0

@dlatikay、私はプロジェクトの仕様に従ってSQLから直接クエリを実行できるとは思わない。 – ferensilver

答えて

0

この

using System; 
using System.Collections.Generic; 
using System.Linq; 
using System.Text; 
using System.Data; 


namespace ConsoleApplication31 
{ 
    class Program 
    { 

     static void Main(string[] args) 
     { 
      DataTable dt = new DataTable(); 

      dt.Columns.Add("ActivationDate", typeof(DateTime)); 
      dt.Columns.Add("CurrentBranchDate", typeof(DateTime)); 
      dt.Columns.Add("AmountFinanced", typeof(decimal)); 
      dt.Columns.Add("Payments", typeof(decimal)); 
      dt.Columns.Add("CurrentBalance", typeof(decimal)); 

      dt.Rows.Add(new object[] { DateTime.Parse("11/01/2016"), DateTime.Parse("11/30/2017"), 57000, 0, 53639.4 }); 
      dt.Rows.Add(new object[] { DateTime.Parse("01/01/2017"), DateTime.Parse("11/30/2017"), 52000, 0, 52000 }); 
      dt.Rows.Add(new object[] { DateTime.Parse("03/01/2017"), DateTime.Parse("11/30/2017"), 28000, 0, 27160.82 }); 
      dt.Rows.Add(new object[] { DateTime.Parse("04/01/2017"), DateTime.Parse("04/30/2017"), 77200, 0, 76190.96 }); 
      dt.Rows.Add(new object[] { DateTime.Parse("04/01/2017"), DateTime.Parse("05/31/2017"), 77200, 0, 76190.96 }); 
      dt.Rows.Add(new object[] { DateTime.Parse("04/01/2017"), DateTime.Parse("06/30/2017"), 77200, 0, 76190.96 }); 
      dt.Rows.Add(new object[] { DateTime.Parse("06/01/2017"), DateTime.Parse("06/30/2017"), 98450, 0, 98450 }); 
      dt.Rows.Add(new object[] { DateTime.Parse("04/01/2017"), DateTime.Parse("07/31/2017"), 77200, 0, 76190.96 }); 
      dt.Rows.Add(new object[] { DateTime.Parse("04/01/2017"), DateTime.Parse("08/31/2017"), 77200, 0, 76190.96 }); 
      dt.Rows.Add(new object[] { DateTime.Parse("04/01/2017"), DateTime.Parse("09/30/2017"), 77200, 0, 76190.96 }); 
      dt.Rows.Add(new object[] { DateTime.Parse("06/01/2017"), DateTime.Parse("07/31/2017"), 98450, 0, 98450 }); 
      dt.Rows.Add(new object[] { DateTime.Parse("06/01/2017"), DateTime.Parse("08/31/2017"), 98450, 0, 98450 }); 
      dt.Rows.Add(new object[] { DateTime.Parse("06/01/2017"), DateTime.Parse("09/30/2017"), 98450, 0, 98450 }); 
      dt.Rows.Add(new object[] { DateTime.Parse("04/01/2017"), DateTime.Parse("10/31/2017"), 77200, 0, 76190.96 }); 
      dt.Rows.Add(new object[] { DateTime.Parse("04/01/2017"), DateTime.Parse("11/30/2017"), 77200, -1947.7, 74616.01 }); 
      dt.Rows.Add(new object[] { DateTime.Parse("06/01/2017"), DateTime.Parse("10/31/2017"), 98450, 0, 98450 }); 
      dt.Rows.Add(new object[] { DateTime.Parse("06/01/2017"), DateTime.Parse("11/30/2017"), 98450, 0, 98450 }); 
      dt.Rows.Add(new object[] { DateTime.Parse("08/01/2017"), DateTime.Parse("08/31/2017"), 20000, 0, 20000 }); 
      dt.Rows.Add(new object[] { DateTime.Parse("08/01/2017"), DateTime.Parse("09/30/2017"), 20000, 0, 20000 }); 
      dt.Rows.Add(new object[] { DateTime.Parse("08/01/2017"), DateTime.Parse("10/31/2017"), 20000, -1631.58, 18540.78 }); 
      dt.Rows.Add(new object[] { DateTime.Parse("08/01/2017"), DateTime.Parse("11/30/2017"), 20000, 0, 18540.78 }); 
      dt.Rows.Add(new object[] { DateTime.Parse("10/01/2017"), DateTime.Parse("10/31/2017"), 25000, -509.55, 24490.45 }); 
      dt.Rows.Add(new object[] { DateTime.Parse("10/01/2017"), DateTime.Parse("11/30/2017"), 25000, 0, 24490.45 }); 

      var quarterResults = dt.AsEnumerable() 
        .GroupBy(x => new { ActivationQuarter = (x.Field<DateTime>("ActivationDate").Month - 1)/3, ActivationYear = x.Field<DateTime>("ActivationDate").Year }) 
        .Select(x => new { 
         activationYear = x.FirstOrDefault().Field<DateTime>("ActivationDate").Year, 
         quarterResults = ((x.FirstOrDefault().Field<DateTime>("ActivationDate").Month - 1)/3) + 1, 
         branchYear = x.FirstOrDefault().Field<DateTime>("CurrentBranchDate").Year, 
         branchQuarter = ((x.FirstOrDefault().Field<DateTime>("CurrentBranchDate").Month - 1)/3) + 1, 
         AmountFinanced = x.GroupBy(y => new { ActivationDate = y.Field<DateTime>("ActivationDate")}).Select(z => z.OrderByDescending(a => a.Field<DateTime>("CurrentBranchDate")).Select(y => y.Field<decimal>("AmountFinanced")).FirstOrDefault()).Sum(), 
         CurrentBalance = x.OrderByDescending(y => y.Field<DateTime>("CurrentBranchDate")).Select(y => y.Field<decimal>("CurrentBalance")).FirstOrDefault(), 
         sum = x.Select(y => y.Field<decimal?>("Payments")).Sum() 
        }).ToArray(); 
     } 
    } 

} 
+0

私はあなたがこれでどこかにいるかもしれないと思います。私がそれを実行している唯一の問題は、AmountFinancedが間違っていることです。それは和の代わりに最初の価値を取っているだけです($ 15,000($ 10,000 + $ 5,000)を与えなければならない場合、私に$ 10,000を与えます)。お支払いは正しいようです。 – ferensilver

+0

例を実行すると、次のようになります。https://i.imgur.com/t4ZjV1r.png私が参考にしなければならない数字は次のとおりです:https://i.imgur.com/LOW9N5V。png – ferensilver

+0

CurrentBranchDateでグループ化することもできませんか? – ferensilver

関連する問題