按分组数据拆分列表
Split List by grouped Data
我有一个显示在数据表上的产品记录列表,这些记录按部门名称/ID 分组。从下图中我返回的数据 不包括突出显示的行 。我正在尝试实现图像中显示的内容 - 对于已经按部门(沙漠,文具,家庭)分组的每组产品,获取总数和部门名称(以及我删除的其他列以减少混乱)到附加到列表
我正在努力实现上述结果
这是我当前的 code/query 其中 returns 此数据没有突出显示的行
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;
我现在的挑战是为每组产品添加分组的部门行数据,并附加到将返回的列表中,即
//--
foreach(grouped dataset by department)
{
//get the totals and heading for each set of data
reportData.q_code = //insert department id
reportData.q_description = //insert department name
reportData.sumOfQuantity = // insert total for that department
list.Add(reportData) //add that to the list that will be shown on view
}
//--
我可以使用 read.GetString() 获取分组数据的部门 ID 和代码。
string deptName = read.GetString(0);
我如何继续遍历 dataReader 并为每个整体集添加总计(如数量列)并将其作为一行添加到列表中?...从显示的图像。
尝试解释得更好一点:
在我的 while 循环中,我如何聚合每个部门产品组的集合并创建一行以添加到列表中。或者有更好的方法来实现这个..
选项 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
通过从 group by
列表中删除一些标识不同 q_saledetail
的字段,求和函数将对所有部门求和而不是分解求和。
抱歉,我不记得手边的联合语句是如何排序的,但我知道你只能排序
在一个地方,要么是最后一个语句,要么是第一个语句,或者是从联合中选择的外部查询。
现在您的数据中的行是每个部门的 'total' 行,您知道
'total' 行,因为 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
的值。
foreach(var group in groupedList)
{
var total = 0;
foreach(var saledetail in group)
{
total += saledetail.sumOfQuantity;
}
}
然后您只需要添加逻辑以按照这些组的顺序将其添加到 list/your 数据表。
希望对您有所帮助。
我有一个显示在数据表上的产品记录列表,这些记录按部门名称/ID 分组。从下图中我返回的数据 不包括突出显示的行 。我正在尝试实现图像中显示的内容 - 对于已经按部门(沙漠,文具,家庭)分组的每组产品,获取总数和部门名称(以及我删除的其他列以减少混乱)到附加到列表
我正在努力实现上述结果
这是我当前的 code/query 其中 returns 此数据没有突出显示的行
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;
我现在的挑战是为每组产品添加分组的部门行数据,并附加到将返回的列表中,即
//--
foreach(grouped dataset by department)
{
//get the totals and heading for each set of data
reportData.q_code = //insert department id
reportData.q_description = //insert department name
reportData.sumOfQuantity = // insert total for that department
list.Add(reportData) //add that to the list that will be shown on view
}
//--
我可以使用 read.GetString() 获取分组数据的部门 ID 和代码。
string deptName = read.GetString(0);
我如何继续遍历 dataReader 并为每个整体集添加总计(如数量列)并将其作为一行添加到列表中?...从显示的图像。
尝试解释得更好一点: 在我的 while 循环中,我如何聚合每个部门产品组的集合并创建一行以添加到列表中。或者有更好的方法来实现这个..
选项 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
通过从 group by
列表中删除一些标识不同 q_saledetail
的字段,求和函数将对所有部门求和而不是分解求和。
抱歉,我不记得手边的联合语句是如何排序的,但我知道你只能排序 在一个地方,要么是最后一个语句,要么是第一个语句,或者是从联合中选择的外部查询。
现在您的数据中的行是每个部门的 'total' 行,您知道 'total' 行,因为 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
的值。
foreach(var group in groupedList)
{
var total = 0;
foreach(var saledetail in group)
{
total += saledetail.sumOfQuantity;
}
}
然后您只需要添加逻辑以按照这些组的顺序将其添加到 list/your 数据表。
希望对您有所帮助。