数据库中有如下数据:
姓名   日期         行程
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

解决方案 »

  1.   

    跟你说下思路:
    new一个DataTable,添加列(根据日期),然后添加4个空行,再遍历数据源,根据“日期”确定列标,根据“姓名”确定行号,把“行程”填入新datatable对应的单元格中,不难的!你试一下吧。。
      

  2.   

    CREATE TABLE tb(Name varchar(200),TravelDate datetime,TravelContent varchar(200))
    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 海南旅游一周
    */
      

  3.   

    姓名那一列是固定的,不管有没有安排行程,都是按那个顺序排列的
    A
    B
    C
    D
    E
    .......
      

  4.   


    这只是一个例子 楼主你仿照着写应该不是什么问题吧
    #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