C# 按分组数据拆分列表
我在数据表上显示了一个产品记录列表,这些记录按部门名称/id分组。从下面的图像中,我返回的数据不包括突出显示的行。我正试图实现图中所示的效果——对于已经按部门(沙漠、文具、家庭)分组的每一套产品,获得总数,以及要附加到列表中的部门名称(以及我删除以减少混乱的其他列) 我正在努力实现上述结果 这是我当前的代码/查询,它返回的数据没有突出显示的行C# 按分组数据拆分列表,c#,postgresql,datareader,C#,Postgresql,Datareader,我在数据表上显示了一个产品记录列表,这些记录按部门名称/id分组。从下面的图像中,我返回的数据不包括突出显示的行。我正试图实现图中所示的效果——对于已经按部门(沙漠、文具、家庭)分组的每一套产品,获得总数,以及要附加到列表中的部门名称(以及我删除以减少混乱的其他列) 我正在努力实现上述结果 这是我当前的代码/查询,它返回的数据没有突出显示的行 List<SaleDetailViewModel> list = new List<SaleDetailViewModel>()
List<SaleDetailViewModel> list = new List<SaleDetailViewModel>();
NpgsqlCommand query = new NpgsqlCommand
("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 " +
"ORDER BY q_saledetail.q_departmentid "
, connectToDB);
NpgsqlDataReader read = query.ExecuteReader();
while(read.Read())
{
var reportData = new SaleDetailViewModel();
reportData.departmentName = read["q_name"].ToString(); //department name
reportData.q_description = read["q_description"].ToString(); //product DESCRIPTION
reportData.q_code = read["q_code"].ToString(); //product BAR CODE
reportData.sumOfQuantity = Convert.ToDecimal(read["qtysum"]); //sum of quantity sold for that product
list.Add(reportData);
}
connectToDB.Close();
return list;
我可以使用read.GetString()获取分组数据的部门id和代码
string deptName=read.GetString(0)代码>
我如何继续在dataReader中循环,为每个集合(如数量列)添加总计,并将其作为一行添加到列表中?。。。从显示的图像中获取结果
尝试更好地解释:
在while循环中,如何聚合每个部门产品组的集合并创建一行以添加到列表中。或者有更好的方法来实现这一点。选项1:Sql和union
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
的字段,sum函数将对所有部门进行求和,而不是将求和分解
很抱歉,我记不清如何即时使用union语句进行排序,但我知道您只能进行排序
在一个位置,可以是最后一条语句,也可以是第一条语句,或者是从联合中选择的外部查询
现在数据中包含的行是每个部门的“总计”行,您知道这些行是
“总计”行,因为q_代码或q_描述字段为空。然后,可以按部门对数据集进行排序,然后按代码(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);
然后,您只需要添加逻辑,将其按这些组的顺序添加到列表/数据表中
希望这能有所帮助。我有点困惑,所以请原谅我可能会遇到的问题,但您的数据集中是否有像“沙漠”这样的部门名称,您正在循环并希望根据这些名称进行聚合?如果您这样做,您可以使用linqGroupBy
,但我有点不确定这是否是您真正想要的……是的,在这种情况下,我的部门是沙漠、文具、家庭等,我想按部门名称进行汇总。获取每个部门的总数,并将其添加到每个分组数据的底部。好的,我可以想到两个选项,一个是在获取数据后使用linq进行分组,或者可以在sql中使用union
,另外一个查询是数据的聚合。我现在就写一个答案。我建议在sql路由中使用union,因为数据库总是比代码中更快。谢谢@topher,我选择了选项2,因为我正在研究该路由,当您响应时。我将在适当的时候研究选项1,因为您指出它比代码更快。
List<SaleDetailViewModel> list = new List<SaleDetailViewModel>();
while(read.Read())
{
... //Your mapping code
list.Add(reportData);
}
var groupedList = list.GroupBy(x => x.departmentName);
foreach(var group in groupedList)
{
var total = 0;
foreach(var saledetail in group)
{
total += saledetail.sumOfQuantity;
}
}