根据另一列的值对数据表中的列求和

Abh*_*Net 1 c# sql

我有一个数据库表,我用它作为报告的来源.表格布局如下.表1是较大数据库表的子集.但是对于报告我只需要某些列所以我使用下面给出的函数创建一个新的数据表

Value  Description   Hours
    1          A           2
    2          B           3
    3          C           5
    1          A           3
    2          B           4
    2          B           3
    3          C           3


private DataTable CreateFocusOfEffortData()
    {
        var dtChartData = new DataTable();
        dtChartData.Columns.Add("Description", typeof(string));
        dtChartData.Columns.Add("Hours", typeof(Double));
        var myDataView = ReportData.DefaultView;
        myDataView.RowFilter = "ActivityUnitID = " + _ActivityUnitID;
        for (var i = 0; i < myDataView.ToTable().Rows.Count; i++)
        {
            var dataRow = new Object[dtChartData.Columns.Count];
            dataRow[0] = ReportData.Rows[i]["Description"];
            dataRow[1] = csaConvert.ToDouble(ReportData.Rows[i]["Hours"]);
            dataRow[2] = ReportData.Rows[i]["Value"];
            dtChartData.Rows.Add(dataRow);
        }
        return dtChartData;
    }
Run Code Online (Sandbox Code Playgroud)

现在我需要设计另一份报告,其中包含上表中的摘要数据.此表应根据Column ["Value]组合所有列的数据.例如,在我的情况下,我们在Value 1,2,3中有三个不同的值.结果表应该为所有三个值总计小时数.

    Value   Description  Hours
    1         A           5
    2         B           10
    3         C           8
Run Code Online (Sandbox Code Playgroud)

现在我可以通过创建另一个存储过程在sql中执行此操作,但我宁愿使用现有的数据表并编写C#函数来获取结果.有没有更简单的方法来使用LINQ实现这一目标?

小智 6

你采取了错误的做法.这在SQL中工作.

 SELECT value, description, sum(hours) as hours from tblData group by value, description;
Run Code Online (Sandbox Code Playgroud)

以上内容将为您提供您在问题中显示的第二个表格.

这样做的原因是将数据传递给客户端应用程序只是为了让它直接传递回SQL会不必要地消耗内存和系统调用.此外,错误,错误,类型转换问题等的空间也少得多.

如果你真的想制作更窄的表(这通常是一个坏主意),那就这样做:

 SELECT value, description, hours from tblData into tblSkinnyData;
Run Code Online (Sandbox Code Playgroud)

通常,如果由于某种原因需要这个瘦表,你可以在主表上使用VIEW.