首页 新闻 会员 周边 捐助

SQL高手帮忙看看这样的查询怎么写

0
悬赏园豆:10 [已解决问题] 解决于 2009-05-23 11:48

现在有一个表是这样的结构和数据:

 

我想要查询出来是这样的结构:

 

请问这条SQL查询该怎么写?

或者有没有一种简单的方式使用 System.Data.DataTable 来转换成图2的结构?

问题补充: 需要说明一下的是 日期 和系统 这两个字段的值都是不确定的。而 Pivot 语法好象要把转换为列的字段硬编码在语句中
luotong的主页 luotong | 初学一级 | 园豆:4
提问于:2009-05-19 11:50
< >
分享
最佳答案
0
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);
});

 

MicroCoder | 小虾三级 |园豆:554 | 2009-05-20 00:17
其他回答(4)
0

行转列

码尔代夫iimax | 园豆:3138 (老鸟四级) | 2009-05-19 12:29
0

可以参考SQL Server 2005支持的Pivot语法

陈希章 | 园豆:2538 (老鸟四级) | 2009-05-19 12:44
0

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  日期') 

代码大概是这了,自己测试一下。

| 园豆:770 (小虾三级) | 2009-05-19 13:48
0

呵呵,哈哈,八仙过海(溪?)啊!

陛下 | 园豆:3938 (老鸟四级) | 2009-05-20 09:20
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册