C#怎么样将查询结果制作统计表

.Net技术 码拜 9年前 (2016-05-17) 1778次浏览
        有一些出入库的数据,想通过C#做一个查询统计的程序。数据有月份  地区 类型(指出、入库) 品类 经办人 数量这几个字段,现在查询部分功能已经做好了,想在结果里进行进一步统计。具体的效果如下:
例如查询条件把“地区”选为“北京”,别的都不选,查询结果就是北京地区的全部数据,然后选月份和经办人(假设有A、B、C、D)作为行、列的标题,就生成这张表:C#怎么样将查询结果制作统计表。第一个单元格就表示经办人A在1月办理的北京地区全部品类,全部类型(出、入库)的数量总和。
没有什么思路,求各位指导~
解决方案

25

先设计出完整的表,有少量测试数据,才好分析
就是个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()));

CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明C#怎么样将查询结果制作统计表
喜欢 (0)
[1034331897@qq.com]
分享 (0)