2011-02-08 3 views
2

У меня есть набор данных, как показано ниже моего Payment таблицыМножественные данные Группа

DateIssue    | Amount | CoursePaidForMonth | 
    2/3/2011 9:54:07 PM | 2000.00|   2 
2/27/2011 2:22:58 PM | 80.00|   2 
3/5/2011 11:14:56 PM | 80.00|   3 
3/27/2011 2:22:58 PM | 80.00|   2 
2/8/2011 6:32:45 PM | 80.00|   2 

Я хотел бы выполнить два набора группирования для данных выше:

  1. Дата закрытия по 27 из каждого месяца, поэтому я хотел бы сгруппировать все данные от 27 до 26 следующего месяца в группу. Это успешно выполняется с gName. БЕЗ ПРОБЛЕМ !! Проверьте выход как изображение ниже.

    DateIssue    AppendCommToMonthΞΞ CoursePaidForMonthΞΞ TotalAmountΞΞ 
    2/8/2011 6:32:45 PM   2     2    2080.00 
    2/27/2011 2:22:58 PM   3     2    160.00 
    3/27/2011 2:22:58 PM   4     2    80.00 
    
  2. Теперь я хотел бы выполнить другую группировку по тому же запросу. Я хотел бы также сгруппировать CoursePaidForMonth. Сказанное означает, что конечный результат должен отображать 4 строки записей вместо 3, он группируется от 27 в этом месяце до 26 следующего месяца в группу, а также CoursePaidForMonth. Как это сделать?

    DateIssue    AppendCommToMonthΞΞ CoursePaidForMonthΞΞ TotalAmountΞΞ 
    2/8/2011 6:32:45 PM   2     2    2080.00 
    2/27/2011 2:22:58 PM   3     2    80.00 
    3/5/2011 11:14:56 PM   3     3    80.00 
    3/27/2011 2:22:58 PM   4     2    80.00 
    

Мой код здесь:

var result = from p in db.Payments 
       join soi in db.SaleOrderItems on p.ReferenceId equals soi.Id 
       join ct in db.CourseByTutors on soi.InventoryOrCourseId equals ct.CourseId        
       where p.PayType == (int)PayTypes.PayCourseFee 
       && ct.TutorId == tutorId 
       let gName = (p.DateIssue.Value.Day < 27) ? (p.DateIssue.Value.Month) : (p.DateIssue.Value.Month % 12 + 1) 
       group p by new { gName} into g 
       select new 
       { 
        DateIssue = g.Select(x => x.DateIssue).First(), 
        AppendCommForWhichMonth = g.Key.gName, 
        CoursePaidForMonth = g.Select(x => x.CoursePaidForMonth).First(), 
           TotalAmount = g.Sum(x => x.Amount), 
       }; 

Пожалуйста совет ..

+0

привет, пожалуйста, сообщите мне, если мой вопрос не имеет смысла для u – VeecoTech

+0

. Я отредактировал вопрос. HOpe теперь имеет больше смысла – VeecoTech

ответ

1

Вам необходимо включить CoursePaidForMonth в ваш ключ. Что-то вроде этого:

var query = from p in db.Payments 
      join soi in db.SaleOrderItems 
       on p.ReferenceId equals soi.Id 
      join cbt in db.CourseByTutors 
       on soi.InventoryOrCourseId equals cbt.CourseId 
      where p.PayType == (int)PayTypes.PayCourseFee && cbt.TutorId == tutorId 
      orderby p.DateIssue 
      let AppendCommForWhichMonth = p.DateIssue.Month + p.DateIssue.Day < 27 ? 0 : 1 
      group p 
       by new { AppendCommForWhichMonth, p.CoursePaidForMonth } 
       into g 
      select new 
      { 
       g.First().DateIssue, 
       g.Key.AppendCommForWhichMonth, 
       g.Key.CoursePaidForMonth, 
       TotalAmount = g.Sum(p => p.Amount), 
      }; 
+0

Я сделал некоторые изменения в запросе. Я не думаю, что это негативно повлияет на результаты. Вы можете изменить его, если хотите. Я приказал ему убедиться, что выбрана самая ранняя дата. Часть '% 12' казалась мне ненужной. Уже месяцы находятся в интервале [0,12). Если я не понял, и это не так в базе данных. –

+0

Спасибо за ответ. я попробовал ваш код, но он сказал, что DateIssue в g.First(). DateIssue, «System.Nullable » не содержит определения для «DateIssue» и никакого метода расширения «DateIssue», принимающего первый аргумент типа «и также «Имя« TotalAmount »не существует в текущем контексте« Должен ли я включать эти 2 в группу с помощью new {}? – VeecoTech

+0

@belinq: То, что я изначально было, было неправильным. Я изменил то, что было сгруппировано, но забыл, что не мог сделать этого для этого запроса. Повторите попытку нового кода. –

Смежные вопросы