Вариант 1 : Sql и союз.
SELECT
q_department.q_name,
q_saledetail.q_code,
q_saledetail.q_description,
SUM(q_quantity) AS qtysum, --running total of q_quantity for the product in that department
FROM q_saledetail
LEFT JOIN q_department ON (q_saledetail.q_departmentid = q_department.q_code )
GROUP BY
q_saledetail.q_departmentid, q_department.q_name, q_saledetail.q_description, q_saledetail.q_code
UNION
SELECT
q_department.q_name,
'',
'',
sum(q_quantity)
FROM q_saledetail
LEFT JOIN q_department ON (q_saledetail.q_departmentid = q_department.q_code )
GROUP BY
q_saledetail.q_departmentid, q_department.q_name
ORDER BY q_saledetail.q_departmentid
Путем удаления некоторых полей, которые идентифицируют различные q_saledetail
из списка group by
, функция суммы будет суммировать все отделы вместо того, чтобы разбивать суммы.
Извинитено я не могу точно вспомнить, как упорядочивание работает с операторами объединения, но я знаю, что вы можете упорядочить только в одном месте, либо в последнем, либо в первом, либо с помощью внешнего запроса, который выбирает из объединения.
То, что вы теперь будете иметь в своих данных, это строки, которые являются «общими» строками для каждого отдела, которые, как вы знаете, являются «общими» строками, потому что поля q_code или q_description пусты.Затем можно упорядочить набор данных по отделам, а затем по коду (asc или desc), чтобы пустое поле кода находилось в конце группы этого отдела, и отображать его следующим образом.
Опция2 : работает Linq и небольшой ручной код
List<SaleDetailViewModel> list = new List<SaleDetailViewModel>();
while(read.Read())
{
... //Your mapping code
list.Add(reportData);
}
var groupedList = list.GroupBy(x => x.departmentName);
, который даст вам IEnumerable<IGrouping<string, SaleDetailViewModel>
.
Что это ваши данные, теперь сгруппированные по названию каждого отделакоторый действует как ключ. Теперь вы перебираете groupedList
и добавляете значения этого IGrouping
up.
foreach(var group in groupedList)
{
var total = 0;
foreach(var saledetail in group)
{
total += saledetail.sumOfQuantity;
}
}
Затем вам просто нужно добавить логику, чтобы добавить ее в список / вашдатируются в порядке следования этих групп.
Надеюсь, это поможет.