C#数据表动态将行转换为列

问题描述 投票:-1回答:2

我在Windows窗体中有一个DataTable,如下所示。

Ref1 |产品编号项目描述1 | 54637 |清洁器2 | 54638 |布1 | 54638 |布1 | 54639 |喷雾瓶2 | 54637 |清洁剂

我需要在单独的列中获取每个Ref1的所有产品。所以我需要得到以下信息。

Ref1 |编号1 |货号2 |产品编号3 |货号41 | 54637 | 54638 | 54639 |空值2 | 54638 | 54637 | NULL | NULL

我可能会为某些裁判提供多达50件物品,而对于其他裁判则只有1或2件。

完成这项工作的最有效方法是什么?

先谢谢您。

c# datatable transpose orders
2个回答
0
投票

我想没有很好的方法,但这是应该起作用的方法

DataTable table = new DataTable();
table.Columns.Add("Ref1", typeof(int));
table.Columns.Add("ItemNo", typeof(int));
table.Columns.Add("ItemDesc", typeof(string));

table.Rows.Add(1, 12345, "Test");
table.Rows.Add(1, 12346, "Test2");
table.Rows.Add(1, 12347, "Test3");
table.Rows.Add(2, 12345, "Test");

DataTable tableNew = new DataTable();

tableNew.Columns.Add("Ref1", typeof(int));

var result = table.AsEnumerable().GroupBy(x => x.Field<int>("Ref1"));
var max = result.Max(x => x.Count());

for (int i = 1; i <= max; i++)
{
    tableNew.Columns.Add($"ItemNo{i}", typeof(int));
}

foreach (var group in result)
{
    var newRow = tableNew.NewRow();
    newRow.SetField<int>("Ref1", group.Key);

    var itemNo = 1;
    foreach(var row in group)
    {
        var val = row.Field<int>("ItemNo");
        newRow.SetField<int>($"ItemNo{itemNo}", val);
        itemNo++;
    }
    tableNew.Rows.Add(newRow);
}

如果数据来自数据库,我建议将部分逻辑移至SQL查询


-1
投票

您在查询中选择后应该使用group by

例如,在SQL Server查询中:

select * from "Your Table"
group by Ref1 

或使用下面的代码删除重复项:

select distinct * from "Your Table"
group by Ref1 
© www.soinside.com 2019 - 2024. All rights reserved.