Rob*_*Rob 2 c# linq sql-server pivot
我确信这在其他地方有所涉及,但我遇到了一些问题,想出一个优雅的解决方案.
ID C D
1 Apple Red
1 Pear Orange
2 Apple Red
2 Pear Orange
Run Code Online (Sandbox Code Playgroud)
我想要最终得到的是:
ID | Benefit | Value
1 | C | Apple
1 | C | Pear
2 | C | Apple
2 | C | Pear
1 | D | Red
1 | D | Orange
2 | D | Red
2 | D | Orange
Run Code Online (Sandbox Code Playgroud)
我可以在Linq中扫描每一列并添加到列表中.
public class SampleRow
{
public Int32 Id { get; set; }
public String A { get; set; }
public String B { get; set; }
}
public class SampleOutput
{
public Int32 Id { get; set; }
public String Description { get; set; }
public String Value { get; set; }
}
List<SampleRow> rows = new List<SampleRow>();
rows.Add(new SampleRow
{
Id = 1,
A = "Apple",
B = "Red"
});
rows.Add(new SampleRow
{
Id = 1,
A = "Pear",
B = "Orange"
});
rows.Add(new SampleRow
{
Id = 2,
A = "Apple",
B = "Red"
});
rows.Add(new SampleRow
{
Id = 2,
A = "Pear",
B = "Orange"
});
List<SampleOutput> output = new List<SampleOutput>();
rows.ForEach(row =>
output.Add(new SampleOutput()
{
Id = row.Id,
Description = "A",
Value = row.A
})
);
rows.ForEach(row =>
output.Add(new SampleOutput()
{
Id = row.Id,
Description = "B",
Value = row.B
})
);
Run Code Online (Sandbox Code Playgroud)
我想知道是否有更好的方法.我对Linq或TSQL解决方案持开放态度.数据存储在SQL中,就像第一个表/对象列表一样.
我认为干净而优雅的解决方案是使用UNPIVOT.
SELECT
ID, Benefit, Value
FROM
Test
UNPIVOT
(Value FOR Benefit IN (C, D)) unpvt
ORDER BY
Benefit, ID
Run Code Online (Sandbox Code Playgroud)
在这里你有一个工作演示
http://sqlfiddle.com/#!6/12884/9
希望这可以帮助
| 归档时间: |
|
| 查看次数: |
127 次 |
| 最近记录: |