【问题标题】:How can I get pivot table from datable with using Linq in VB.NET?如何在 VB.NET 中使用 Linq 从数据表中获取数据透视表?
【发布时间】:2019-03-15 12:45:03
【问题描述】:

我有一个这样的数据表:

name    |   color of name
----------------------
x       |   red
y       |   blue
z       |   yellow
x       |   yellow
y       |   red

我需要像这样获取这张表的轴心:

name    |   red     |   blue    |   yellow  | total
-------------------------------------------------------
x       |   1       |   0       |   1       |   2
y       |   1       |   1       |   0       |   2
z       |   0       |   0       |   1       |   1

如何在 VB.NET 中使用 Linq 做到这一点?

颜色不是动态的。我可以将它们以硬编码的形式放入查询中。

所以我需要按名称和列中记录颜色的总和对所有记录进行分组。 然后是总颜色的总和(如果你在第一个方面提供帮助,我可以计算总数:p)

【问题讨论】:

  • 我建议将其视为两个步骤:1. 透视数据 2. 添加total 列。 namecolor of name 列是否仅限于有限的数据集,还是您需要一个完全通用的解决方案?
  • 如果您可以编辑问题并解释您已经尝试过的内容,这将有所帮助。
  • @NetMage 你是完全正确的。大问题是第一个。颜色名称受到限制,可以硬编码。我需要按名称对所有记录进行分组,名称的规模非常大。

标签: c# .net vb.net linq datatable


【解决方案1】:

我创建了 DataTable 枢轴扩展方法的变体,它根据列的存在创建交集值并添加总列。

public static class DataTableExt {
    public static DataTable PivotByOverWithTotal(this DataTable dt, string ByRowFieldName, string OverColFieldName) {
        var res = new DataTable();
        if (dt.Rows.Count > 0) {
            var dtg = dt.AsEnumerable().GroupBy(r => r[ByRowFieldName], r => r[OverColFieldName].ToString());

            res.Columns.Add(ByRowFieldName, dt.Columns[ByRowFieldName].DataType);
            var colNames = dtg.SelectMany(rg => rg).Distinct().OrderBy(n => n);
            foreach (var n in colNames)
                res.Columns.Add(n, typeof(int));
            res.Columns.Add("Total", typeof(int));

            foreach (var rg in dtg) {
                var newr = res.NewRow();
                newr[ByRowFieldName] = rg.Key;
                int total = 0;
                foreach (var rv in colNames) {
                    var val = rg.Contains(rv) ? 1 : 0;
                    newr[rv] = val;
                    total += val;
                }
                newr["Total"] = total;
                res.Rows.Add(newr);
            }
        }
        return res;
    }
}

你可以这样使用它:

var ansdt = src.PivotByOverWithTotal("name", "color");

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-07-25
    • 1970-01-01
    • 1970-01-01
    • 2010-12-07
    • 2020-11-09
    • 2019-09-29
    • 1970-01-01
    • 2015-12-11
    相关资源
    最近更新 更多