数据库中有如下数据:
姓名 日期 行程
A 2011-12-22 出差去北京
A 2011-12-30 出差去日本
B 2011-12-23 上海办事
C 2011-12-26 去机场接人
D 2011-12-28 海南旅游一周.......然后要进行行列转换之后得到的数据如下: 12-22 12-23 12-24 12-25 12-26 12-27 12-28 12-29 12-30 12-31
A 出差去北京 出差去日本
B 上海办事
C 去机场接人
D 海南旅游一周...................有点类似像个日历一样,把几个人的行程写在上面,日期是第一列显示今天,之后就是连续的一个月的日期。请问这样的该如何写呢?
C
D
姓名 日期 行程
A 2011-12-22 出差去北京
A 2011-12-30 出差去日本
B 2011-12-23 上海办事
C 2011-12-26 去机场接人
D 2011-12-28 海南旅游一周.......然后要进行行列转换之后得到的数据如下: 12-22 12-23 12-24 12-25 12-26 12-27 12-28 12-29 12-30 12-31
A 出差去北京 出差去日本
B 上海办事
C 去机场接人
D 海南旅游一周...................有点类似像个日历一样,把几个人的行程写在上面,日期是第一列显示今天,之后就是连续的一个月的日期。请问这样的该如何写呢?
C
D
new一个DataTable,添加列(根据日期),然后添加4个空行,再遍历数据源,根据“日期”确定列标,根据“姓名”确定行号,把“行程”填入新datatable对应的单元格中,不难的!你试一下吧。。
INSERT tb SELECT 'A','2011-12-22','出差去北京'
UNION ALL SELECT 'A','2011-12-30','出差去日本'
UNION ALL SELECT 'B','2011-12-23','上海办事'
UNION ALL SELECT 'C','2011-12-26','去机场接人'
UNION ALL SELECT 'D','2011-12-28','海南旅游一周' DECLARE @col varchar(2000)
DECLARE @sql varchar(4000)
SELECT @col=ISNULL(@col+',','')+'MAX(CASE TravelDate WHEN '''+CONVERT(nvarchar(10),TravelDate,20)+''' THEN TravelContent ELSE '''' END) AS ['+CONVERT(nvarchar(10),TravelDate,20)+']' FROM (SELECT DISTINCT TravelDate FROM tb) t
SET @sql='SELECT Name,'+@col+' FROM tb WHERE 1=1 GROUP BY Name'
exec(@sql)/*
Name 2011-12-22 2011-12-23 2011-12-26 2011-12-28 2011-12-30
A 出差去北京 出差去日本
B 上海办事
C 去机场接人
D 海南旅游一周
*/
A
B
C
D
E
.......
这只是一个例子 楼主你仿照着写应该不是什么问题吧
#region 行列转换代码
public static DataTable Col2Row(DataTable src, int columnHead)
{
DataTable result = new DataTable();
DataColumn myHead = src.Columns[columnHead];
result.Columns.Add(myHead.ColumnName);
for (int i = 0; i < src.Rows.Count; i++)
{
result.Columns.Add(src.Rows[i][myHead].ToString());
} foreach (DataColumn col in src.Columns)
{
if (col == myHead)
continue;
object[] newRow = new object[src.Rows.Count + 1];
newRow[0] = col.ColumnName;
for (int i = 0; i < src.Rows.Count; i++)
{ newRow[i + 1] = src.Rows[i][col]; } result.Rows.Add(newRow);
}
return result; } public static DataTable Col2Row(DataTable src, string columnHead)
{
for (int i = 0; i < src.Columns.Count; i++)
{
if (src.Columns[i].ColumnName.ToUpper() == columnHead.ToUpper())
return Col2Row(src, i);
}
return new DataTable();
}
#endregion