现在有一个表是这样的结构和数据:
我想要查询出来是这样的结构:
请问这条SQL查询该怎么写?
或者有没有一种简单的方式使用 System.Data.DataTable 来转换成图2的结构?
Code
List<TestPivot> pivotList = new List<TestPivot>
{
new TestPivot{Date="2009年1月",Name="Macpp",Count=1},
new TestPivot{Date="2009年1月",Name="Unix",Count=2},
new TestPivot{Date="2009年1月",Name="UnKonw",Count=7},
new TestPivot{Date="2009年1月",Name="Win2000",Count=23},
new TestPivot{Date="2009年1月",Name="WinNT",Count=10},
new TestPivot{Date="2009年1月",Name="WinXp",Count=2},
new TestPivot{Date="2009年2月",Name="UnKonw",Count=7},
new TestPivot{Date="2009年2月",Name="Win2000",Count=23},
new TestPivot{Date="2009年2月",Name="Macpp",Count=18},
new TestPivot{Date="2009年2月",Name="Unix",Count=23},
new TestPivot{Date="2009年3月",Name="Unix",Count=2},
new TestPivot{Date="2009年3月",Name="UnKonw",Count=7},
new TestPivot{Date="2009年3月",Name="Win2000",Count=23},
new TestPivot{Date="2009年3月",Name="WinNT",Count=10},
new TestPivot{Date="2009年3月",Name="WinXp",Count=2},
};
DataTable datatable = new DataTable();
datatable.Columns.Add("日期",typeof(string));
var nameArray = pivotList.Select(d => d.Name).Distinct().ToArray();
Array.ForEach(nameArray, n => { datatable.Columns.Add(n, typeof(int)); });
var dataArray = pivotList.Select(d => d.Date).Distinct().ToArray();
Array.ForEach(dataArray, d =>
{
DataRow row = datatable.NewRow();
row["日期"] = d;
Array.ForEach(nameArray, n =>
{
row[n] = pivotList.Where(c => c.Name == n && c.Date == d).Select(c => c.Count).Sum();
});
datatable.Rows.Add(row);
});
行转列
可以参考SQL Server 2005支持的Pivot语法
declare @maxs nvarchar(4000)
declare @s nvarchar(4000)
Select @maxs=isnull(@maxs+',','')+'max('+ quotename(系统) +') as'+ quotename(a1),@s=isnull(@s+',','')+ quotename(系统)
from 表名 group by 系统
exec('select 日期,'+@maxs+' from (select * FROM 表名) A pivot (max([数量]) for 系统 in('+@s+')) B group by 日期')
代码大概是这了,自己测试一下。
呵呵,哈哈,八仙过海(溪?)啊!