繁体   English   中英

如何将相似的数据表项分组并在一行中显示聚合值?

[英]How to group Similar DataTable Items and show in One Row with aggregation values?

我有像波纹管这样的数据表值,现在我想根据第二列的值将这些值分组为“一行”,并能够像波纹管那样计算总计。 任何想法都可以分享。

所需的格式数据,例如波纹管

1KT049014L1(F),L2(F),R1(F),R2(F)Ghoousunnisa(F)9999999999 Nellore 2200 220 1980 APIEasyBus Agent

实际数据格式

1 KT049014 L1 Ghoousunnisa(F)9999999999 Nellore 550 55495 API EasyBus代理

2 KT049014 L2 Ghoousunnisa(F)9999999999 Nellore 550 55495 API EasyBus代理

3 KT049014 R1 Ghoousunnisa(F)9999999999 Nellore 550 55495 API EasyBus代理

4 KT049014 R2 Ghoousunnisa(F)9999999999 Nellore 550 55495 API EasyBus代理

    static void Main(string[] args)
    {
        var dt = new DataTable();
        dt.Columns.Add("A", typeof(int));
        dt.Columns.Add("B", typeof(string));
        dt.Columns.Add("C", typeof(string));
        dt.Columns.Add("D", typeof(string));
        dt.Columns.Add("E", typeof(string));
        dt.Columns.Add("F", typeof(string));
        dt.Columns.Add("G", typeof(string));
        dt.Columns.Add("H", typeof(decimal));
        dt.Columns.Add("I", typeof(decimal));
        dt.Columns.Add("J", typeof(decimal));
        dt.Columns.Add("K", typeof(string));
        dt.Columns.Add("L", typeof(string));
        dt.Columns.Add("M", typeof(string));
        dt.Rows.Add(1, "KT049014", "L1", "Ghoousunnisa", "(F)", "9999999999", "Nellore", 550, 55, 495, "API", "EasyBus", "Agent");
        dt.Rows.Add(2, "KT049014", "L2", "Ghoousunnisa", "(F)", "9999999999", "Nellore", 550, 55, 495, "API", "EasyBus", "Agent");
        dt.Rows.Add(3, "KT049014", "R1", "Ghoousunnisa", "(F)", "9999999999", "Nellore", 550, 55, 495, "API", "EasyBus", "Agent");
        dt.Rows.Add(4, "KT049014", "R2", "Ghoousunnisa", "(F)", "9999999999", "Nellore", 550, 55, 495, "API", "EasyBus", "Agent");

        var datas =
            dt.AsEnumerable()
            .GroupBy(row => row[1])
            .Select((group, i) => new {A = i + 1, B = group.Key, Others = combine(dt.Columns, group)});
        var result = dt.Clone();
        foreach (var d in datas)
        {
            var row = result.Rows.Add(d.A, d.B);
            for (int i = 0; i < d.Others.Count(); i++)
                row[i + 2] = d.Others.ElementAt(i);
        }
    }

    private static IEnumerable<object> combine(DataColumnCollection columns, IGrouping<object, DataRow> group)
    {
        for (int i = 2; i < columns.Count; i++)
        {
            if (columns[i].DataType == typeof(string))
                yield return string.Join(",", group.Select(r => r.Field<string>(i)).Distinct());
            else
                yield return group.Sum(r => r.Field<decimal>(i));
        }
    }
}

L1(F),L2(F),R1(F),R2(F):

string.Join(",", group.Select(r=>string.Concat(r[2], r[4])))

Ghoousunnisa(F)9999999999 Nellore APIEasyBus代理商:

(我不知道他们在小组中是否总是一样)

string.Join(",", group.Select(r=>r.Field<string>("D")))
string.Join(",", group.Select(r=>.Field<string>("D")).Distinct())
group.Select(r=>r.Field<string>("D")).First()

2200 220 1980:

group.Sum(r=>r.Field<decimal>("I"))

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM