Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/postgresql/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 按分组数据拆分列表_C#_Postgresql_Datareader - Fatal编程技术网

C# 按分组数据拆分列表

C# 按分组数据拆分列表,c#,postgresql,datareader,C#,Postgresql,Datareader,我在数据表上显示了一个产品记录列表,这些记录按部门名称/id分组。从下面的图像中,我返回的数据不包括突出显示的行。我正试图实现图中所示的效果——对于已经按部门(沙漠、文具、家庭)分组的每一套产品,获得总数,以及要附加到列表中的部门名称(以及我删除以减少混乱的其他列) 我正在努力实现上述结果 这是我当前的代码/查询,它返回的数据没有突出显示的行 List<SaleDetailViewModel> list = new List<SaleDetailViewModel>()

我在数据表上显示了一个产品记录列表,这些记录按部门名称/id分组。从下面的图像中,我返回的数据不包括突出显示的行。我正试图实现图中所示的效果——对于已经按部门(沙漠、文具、家庭)分组的每一套产品,获得总数,以及要附加到列表中的部门名称(以及我删除以减少混乱的其他列)

我正在努力实现上述结果

这是我当前的代码/查询,它返回的数据没有突出显示的行

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);
然后,您只需要添加逻辑,将其按这些组的顺序添加到列表/数据表中


希望这能有所帮助。

我有点困惑,所以请原谅我可能会遇到的问题,但您的数据集中是否有像“沙漠”这样的部门名称,您正在循环并希望根据这些名称进行聚合?如果您这样做,您可以使用linq
GroupBy
,但我有点不确定这是否是您真正想要的……是的,在这种情况下,我的部门是沙漠、文具、家庭等,我想按部门名称进行汇总。获取每个部门的总数,并将其添加到每个分组数据的底部。好的,我可以想到两个选项,一个是在获取数据后使用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;
    }


}