有一些出入库的数据,想通过C#做一个查询统计的程序。数据有月份 地区 类型(指出、入库) 品类 经办人 数量这几个字段,现在查询部分功能已经做好了,想在结果里进行进一步统计。具体的效果如下:
例如查询条件把“地区”选为“北京”,别的都不选,查询结果就是北京地区的全部数据,然后选月份和经办人(假设有A、B、C、D)作为行、列的标题,就生成这张表:。第一个单元格就表示经办人A在1月办理的北京地区全部品类,全部类型(出、入库)的数量总和。
没有什么思路,求各位指导~
例如查询条件把“地区”选为“北京”,别的都不选,查询结果就是北京地区的全部数据,然后选月份和经办人(假设有A、B、C、D)作为行、列的标题,就生成这张表:。第一个单元格就表示经办人A在1月办理的北京地区全部品类,全部类型(出、入库)的数量总和。
没有什么思路,求各位指导~
解决方案
25
先设计出完整的表,有少量测试数据,才好分析
就是个sql查询,像下面这样
就是个sql查询,像下面这样
select sum(数量) as 数量 from tale where 地区="北京" and 月份="1月" and 经办人="林黛玉" and 类型="入库"
25
用groupby分组,然后写入datagridview
50
题主的意思是该报表的数据源已经确定,但是想通过用于自定义的方式来以不同的形式来展示报表数据,各非聚合字段可以选择显示与否,还可以选择若干列作为透视列。原因是显示字段的不确定性,所以不推荐使用动态组织SQL语句来实现,而是将最多列的结果查询出来,然后使用DataTable.AsEnumerable()使用Linq来进行后期分组,复杂些的可以使用表达式树来组建动态的Linq查询,简单的可以将需要分组的列各行的值连接成字符串再分组。
var q = dataSource.AsEnumerable().GroupBy( //按行字段合并内容为key进行分组 o => string.Join("|", rl.RowFields.Select(f => o[f.Name].ToString())) ).Select( //生成新的数据行集 g1 => new { //行字段数据(第一个DataRow即可,因该IGrouping元素中行字段内容是相同的) RowData = rl.RowFields.Select(o => g1.First()[o.Name].ToString()).ToArray(), ColumData = g1.GroupBy( //按透视字段合并内容为key进行分组 o => rl.ColumnFields.Count == 0 ? string.Empty : string.Join("|", rl.ColumnFields.Select(f => o[f.Name].ToString()) )).Select( //生成透视列行集 g2 => new { ColumnKey = g2.Key, //汇总字段汇总数据数组 Data = rl.DataFields.Select(o => g2.Sum(p => p[o.Name] == DBNull.Value ? 0M : Convert.ToDecimal(p[o.Name]))).ToArray() }).ToDictionary(o => o.ColumnKey, o => o.Data) }).OrderBy(o => o.RowData, new CompareRowData(rl.RowFields.ToArray()));