2009-12-09 3 views
1

데이터에서 날짜 별 합계와 GrandTotal을 찾아야 만합니다. 적용 할 수없는 경우 은 (***)으로 채워야합니다.C# - 날짜 별 합계와 GrandTotal (LINQ를 사용)

OrderID  OrderAmt OrderDate            
----------- ---------- -------------------- 
1   10.50  2003-10-11 08:00:00 
2   11.50  2003-10-11 10:00:00 
3   1.25  2003-10-11 12:00:00 
4   100.57  2003-10-12 09:00:00 
5   19.99  2003-10-12 11:00:00 
6   47.14  2003-10-13 10:00:00 
7   10.08  2003-10-13 12:00:00 
8   7.50  2003-10-13 19:00:00 
9   9.50  2003-10-13 21:00:00 

출력

OrderID  Order Date OrderAmt Sub Total Grand Total 
----------- ---------- ---------- ---------- ----------- 
1   10/11/2003 10.50  ***   ***    
2   10/11/2003 11.50  ***   ***   
3   10/11/2003 1.25  23.25  ***   
4   10/12/2003 100.57  ***   ***    
5   10/12/2003 19.99  120.56  ***   
6   10/13/2003 47.14  ***   ***   
7   10/13/2003 10.08  ***   ***   
8   10/13/2003 7.50  ***   ***   
9   10/13/2003 9.50  74.22  218.03 

다음 쿼리에 필요한 변화가 무엇입니까?

var qry = 
       (from o in ord 

       select new 
       { 

        OrdNumber = o.OrderNumber, 
        OrdDate = o.OrderDate, 
        Amount = o.OrderAmount, 
        GrandTotal = ord.Sum(p => p.OrderAmount) 
       } 
       ).ToList(); 
+2

:-) 데이터 집합을 통해 반복에 부끄러움이없는, 괜찮아요? –

답변

2

는 별개로 읽을 수, 그리고 격렬하게 비효율적 인에서,이 트릭을 할해야합니다. 당신 만 SQL을 사용하여에 묶여 있지만, 기회가 주어지면 이러한 종류의 코드를 해킹하는 것은 당신이 SQL이 모델 얼마나

1

데이터의이 의지 그룹도이 목록

public class MyClass 
{ 
    public int OrderID; 
    public decimal OrderAmount; 
    public DateTime OrderDate; 
} 

List<MyClass> list = new List<MyClass>(); 
list.Add(new MyClass { OrderID = 1, OrderAmount = 10.50m, OrderDate = new DateTime(2009, 10, 11, 8, 0, 0) }); 
list.Add(new MyClass { OrderID = 1, OrderAmount = 11.50m, OrderDate = new DateTime(2009, 10, 11, 10, 0, 0) }); 
list.Add(new MyClass { OrderID = 1, OrderAmount = 1.25m, OrderDate = new DateTime(2009, 10, 11, 12, 0, 0) }); 

list.Add(new MyClass { OrderID = 1, OrderAmount = 100.57m, OrderDate = new DateTime(2009, 10, 12, 09, 0, 0) }); 
list.Add(new MyClass { OrderID = 1, OrderAmount = 19.99m, OrderDate = new DateTime(2009, 10, 12, 11, 0, 0) }); 

var t = from l in list 
    group l by l.OrderDate.Date into g 
    let sum = g.Sum(x => x.OrderAmount) 
    select new { g.Key, sum , GrandTotal = list.Sum(x => x.OrderAmount) }; 

회원님이 위 요구하는 형식으로 그것을 얻을하는 방법을 확인을 통해 총계를 보여? 나는 데이터 포맷에 대한 LINQ를 사용하여 재고를 촉구 일반적인 면책 조항으로

var SubTotals = from o in ord 
       group o by o.OrderDate.Date into g 
        select new 
           { 
            Id = g.Max(x => x.OrderNumber), 
            Amount = g.Sum(x => x.OrderAmount) 
           }; 
var qry = from o in ord 
      orderby o.OrderDate 
      let subTotals = SubTotals.Where(x => x.Id == o.OrderNumber) 
      let grandTotal = ord.Sum(x => x.OrderAmount) 
      let lastId = ord.OrderBy(x => x.OrderNumber).Last().OrderNumber 
      select 
       new 
        { 
         OrderNumber = o.OrderNumber, 
         OrderDate = o.OrderDate.Date, 
         Amount = o.OrderAmount, 
         SubTotal = (subTotals.Any() 
            ? subTotals.First().Amount.ToString() 
            : "***"), 
         GrandTotal = (o.OrderNumber == lastId 
            ? grandTotal.ToString() 
            : "***") 
        }; 

: