动态地将行转为列
Transposing rows to columns dynamically
我正在使用 C#,
我的 Windows 表单中有一个数据表,如下所示。
Ref1 | ItemNo | ItemDesc
1 | 54637 | Cleaner
2 | 54638 | Cloth
1 | 54638 | Cloth
1 | 54639 | Spray Bottle
2 | 54637 | Cleaner
我需要在单独的列中获取每个 Ref1 的所有产品。所以我需要得到以下内容。
Ref1 | ItemNo1 | ItemNo2 | ItemNo3 | ItemNo4
1 | 54637 | 54638 | 54639 | NULL
2 | 54638 | 54637 | NULL | NULL
对于某些参考文献,我最多可能有 50 个项目,但对于其他参考文献,我可能只有 1 或 2 个项目。
完成这项工作最有效的方法是什么?
我想没有什么好办法,但应该是这样的
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 查询
我正在使用 C#, 我的 Windows 表单中有一个数据表,如下所示。
Ref1 | ItemNo | ItemDesc
1 | 54637 | Cleaner
2 | 54638 | Cloth
1 | 54638 | Cloth
1 | 54639 | Spray Bottle
2 | 54637 | Cleaner
我需要在单独的列中获取每个 Ref1 的所有产品。所以我需要得到以下内容。
Ref1 | ItemNo1 | ItemNo2 | ItemNo3 | ItemNo4
1 | 54637 | 54638 | 54639 | NULL
2 | 54638 | 54637 | NULL | NULL
对于某些参考文献,我最多可能有 50 个项目,但对于其他参考文献,我可能只有 1 或 2 个项目。
完成这项工作最有效的方法是什么?
我想没有什么好办法,但应该是这样的
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 查询