2010-12-14 18 views
0

ここに私が現時点で取り組んでいるものがあります。Linqtosqlクエリ:トップ日付..総数.. groupby orderby .. =楽しいもの:)

私は借金テーブルを持つデータベース(債務の種類、ビザ/マスターなど)と月額表(債務残高12月ビザ法案量の各タイプの毎月の量など)を持っています。

どのように私は最後に基づく債務の合計額を取得するには、DBに対してクエリを実行するきゅうを使用するには、毎月の負債額(すべてのケースでは必ずしも現在の月)を報告しました。

これまでのところ、私はこれを試してみました:

(from M in MonthlyAmounts 
group M by new {M.MonthYear.Month, M.MonthYear.Year} into D 
orderby D.Key.Month descending 
select D).Take(1); 

月で分解量をリストするための素晴らしいですが、それは現在の月のために報告されていない債務の額の私の問題を解決しませんまだ。 So: 最新の報告期間からすべての債務を払い戻し、それらを合計してください(それらのリストもいいでしょう)。サイドノートでは

それが重要ならば、私はSQLのDBに対してEntityFrameworkを使用しています。また、 "MonthYear"はDateTimeです。与えられた債務のタイプのための1つのレコードのみが存在することになるかどうか

public class MonthlyAmount 
{ 
    public DateTime MonthYear { get; set;} 
    public string DebtType { get; set;} 
    public decimal DebtAmount { get; set;} 
} 

た場合は、あなたの質問から明らかではなかった:私はあなたのMonthAmountsテーブルの構造はとても似ていると仮定するつもりだ

+0

私は「最後に報告された毎月の債務の額に基づいて債務の合計額を得る」と私たちは債務額が格納されている場所を推測する必要がないならば、それはいいだろう理解していません。 – VVS

+0

申し訳ありませんが、DB構造をもっと追加する必要があると思います。 – CraigF

+0

私は2つのテーブルを1つは債務タイプ(IDと名前)のリストであり、もう1つは各債務(DebtId int32、 "MonthYear"日時、 "DebtAmount"小数点)の債務エントリのリストです。 – CraigF

答えて

0

&月/年の組み合わせかどうか。そして、あなたは明示的にMonthYearDateTimeのタイプであると言っているので、私はある月に与えられた債務タイプのレコードがいくつでもあると仮定します。このように、グループ化する必要がある個々のトランザクションのテーブルがあると考えています。私が間違っていれば、あなたは明確にしてください。だからここ

が必要なクエリです:

var codedMonthlyAmounts = 
    from ma in MonthlyAmounts 
    let MonthCode = 
     ma.MonthYear.Year * 12 
     + ma.MonthYear.Month 
     - 1 
    select new 
    { 
     MonthCode, 
     ma.DebtType, 
     ma.DebtAmount, 
    }; 

var latest = 
    from cma in codedMonthlyAmounts 
    group cma by cma.DebtType into gcmas 
    let DebtType = gcmas.Key 
    let current = gcmas 
     .GroupBy(gcma => gcma.MonthCode) 
     .OrderBy(ggcma => ggcma.Key) 
     .Last() 
    let DebtAmount = current.Sum(c => c.DebtAmount) 
    let monthCode = current.Key 
    let year = monthCode/12 
    let month = monthCode % 12 + 1 
    let MonthYear = new DateTime(year, month, 1) 
    select new MonthlyAmount() 
    { 
     DebtType = DebtType, 
     MonthYear = MonthYear, 
     DebtAmount = DebtAmount, 
    }; 

あなたはこれが動作するかどうかをテストしたい場合は、このコードを使用します。

var MonthlyAmounts = new List<MonthlyAmount>(); 

var now = DateTime.Now; 

MonthlyAmounts.Add(new MonthlyAmount() 
    { MonthYear = now, 
     DebtType = "Visa", DebtAmount = 1.2M, }); 
MonthlyAmounts.Add(new MonthlyAmount() 
    { MonthYear = now.Subtract(TimeSpan.FromDays(2)), 
     DebtType = "Visa", DebtAmount = 42.0M, }); 
MonthlyAmounts.Add(new MonthlyAmount() 
    { MonthYear = now.Subtract(TimeSpan.FromDays(31)), 
     DebtType = "MC", DebtAmount = 50.95M, }); 
MonthlyAmounts.Add(new MonthlyAmount() 
    { MonthYear = now.Subtract(TimeSpan.FromDays(33)), 
     DebtType = "Visa", DebtAmount = 3.1415M, }); 

//insert above `codedMonthlyAmounts` & `latest` queries here. 

var format = "{0} @ {1:MMM} {1:yyyy} = {2:#,##0.00}"; 
foreach (var x in latest) 
{ 
    Console.WriteLine(format, 
     x.DebtType, 
     x.MonthYear, 
     x.DebtAmount); 
} 

Console.WriteLine("Total = {0:#,##0.00}", 
    latest.Sum(l => l.DebtAmount)); 

テストコードの出力は次のとおりです。

Visa @ Dec 2010 = 43.20 
MC @ Nov 2010 = 50.95 
Total = 94.15 

が、これはあなたが望んでいたか何であるなら、私に教えてください。

+0

今、テストしていますが、これはお金の上で正しく見えます。 – CraigF

+0

2番目のクエリがこれをスローする理由は何か考えてください:{"LINQ to Entitiesは 'System.Linq.IGrouping'2 [System。 Int32、<> f__AnonymousType1'3 [System.Int32、System.Int32、System.Decimal]] 最後[IGrouping'2](System.Collections.Generic.IEnumerable'1 [System.Linq.IGrouping'2 [System.Int32 、<> f__AnonymousType1'3 [System.Int32、System.Int32、System.Decimal]])) ' メソッドであり、このメソッドをストア式に変換することはできません。"} – CraigF

+0

@CraigF - EF(またはLINQ-to-SQLなど)がLINQ文をSQLクエリに変換する方法を知らない場合、これらの種類のエラーが発生します.LINQ-to-Objectsでは、 'latest'クエリの' codedMonthlyAmounts'に '.ToArray()'を追加すると、あなたはうまくいくでしょう。 – Enigmativity

関連する問題