1

私は次のようなSQLコードを持っています。

Select GroupName, sum(LineAmount) as Total, WeekNumber,
    ROW_NUMBER() over (partition by WeekNumber order by sum(LineAmount) desc) as RowNum
from
    Invoices
where
    month(InvoiceDate)=month(getdate())
group by
    GroupName,WeekNumber

これをLINQに変換したいのですが、運がありません。LINQtoObjectを使用しています。どんな助けでもいただければ幸いです。TIA

編集:ここにいくつかのサンプルデータと期待される結果があります。

public class Invoice
{
    public string GroupName { get; set; }
    public int LineAmount { get; set; }
    public int WeekNum { get; set; }
}

   List<Invoice> theData = new List<Invoice>();
    theData.Add(new Invoice { GroupName = "A", LineAmount = 1, WeekNum = 1});
    theData.Add(new Invoice { GroupName = "A", LineAmount = 2, WeekNum = 1 });
    theData.Add(new Invoice { GroupName = "A", LineAmount = 3, WeekNum = 1 });
    theData.Add(new Invoice { GroupName = "A", LineAmount = 2, WeekNum = 2 });
    theData.Add(new Invoice { GroupName = "A", LineAmount = 3, WeekNum = 2 });
    theData.Add(new Invoice { GroupName = "A", LineAmount = 4, WeekNum = 2 });
    theData.Add(new Invoice { GroupName = "B", LineAmount = 4, WeekNum = 1 });
    theData.Add(new Invoice { GroupName = "B", LineAmount = 3, WeekNum = 1 });
    theData.Add(new Invoice { GroupName = "B", LineAmount = 7, WeekNum = 2 });
    theData.Add(new Invoice { GroupName = "B", LineAmount = 6, WeekNum = 2 });
    theData.Add(new Invoice { GroupName = "B", LineAmount = 5, WeekNum = 2 });

ここに画像の説明を入力してください

現時点では問題がないため、最初のクエリから「where」を削除しました。

4

3 に答える 3

1
theData
.GroupBy(g => new {g.GroupName, g.WeekNum}, (key, gg) => new {key.GroupName, key.WeekNum, Total = gg.Sum(g => g.LineAmount)})
.GroupBy(g => g.WeekNum, (weekNum, gg) => gg.OrderByDescending(g => g.Total).Select((g,i) => new {g.GroupName, g.Total, g.WeekNum, RowNum = i}))
.SelectMany(g => g)
于 2012-08-08T07:11:26.663 に答える
0

必要な言語が指定されていません。C# のコードは次のとおりです。

int index = 0;
var filteredInvoices = (from i in invoices
where i.InvoiceDate.Month == DateTime.Now().Month
group i by new { i.GroupName, i.WeekNumber }
into ig
select new {i.GroupName, Total = ig.Sum(i => i.LineAmount), i.WeekNumber, RowNum = ++index}).OrderByDescending(n => n.Total);

filteredInvoices には、必要な結果が含まれている必要があります。また、i.InvoiceDate は DateTime 型であると想定しています。

于 2012-08-07T20:27:55.200 に答える
0

Serg Rogovtsev の回答により、期待される結果が得られます。そして、以下のコードは私がやったことです。どちらが優れているかはわかりませんが、結果は同じです。

(theData.GroupBy(f => new { f.GroupName, f.WeekNum})
                .Select(r => new {r.Key.WeekNum, r.Key.GroupName, Total = r.Sum(f => f.LineAmount)}))
                .GroupBy(r => new {r.WeekNum}).SelectMany(
                    g =>
                    g.OrderByDescending(f => f.Total).Select(
                        (f, index) => new { f.GroupName, f.Total, f.WeekNum, Ix = index + 1 })) 
于 2012-08-08T08:16:12.297 に答える