私は現在、必要なデータが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を私に与えます。
を試してみては、これまで私たちにあなたが持っているコードを表示するので、我々は問題を見つけることができるかもしれません。メモリ内でグループ化するのではなく、データベースから四半期ごとにグループ化したデータをクエリするオプションがありますか? obtw、ぼかしは安全なデータ保護ではありません。 – dlatikay
私は1分以内にコードを投稿します。すべてのデータはテストデータですが、私は例のためにそれをぼかしています。私が支払いを正確に合計することができれば、残りは同じになります。 – ferensilver
@dlatikay、私はプロジェクトの仕様に従ってSQLから直接クエリを実行できるとは思わない。 – ferensilver