表A:列1   列2
AAAA  BB
AAAA  DD
BBBB  EE
BBBB  FF
BBBB  GG
CCCC  HH想得到:列1   列2    列3   列4
AAAA  BB     DD
BBBB  EE     FF    GG
CCCC  HH

解决方案 »

  1.   


    --行列互转
    /******************************************************************************************************************************************************
    以学生成绩为例子,比较形象易懂
    ******************************************************************************************************************************************************/--1、行互列
    --> --> (Roy)生成測試數據if not object_id('Class') is null
        drop table Class
    Go
    Create table Class([Student] nvarchar(2),[Course] nvarchar(2),[Score] int)
    Insert Class
    select N'张三',N'语文',78 union all
    select N'张三',N'数学',87 union all
    select N'张三',N'英语',82 union all
    select N'张三',N'物理',90 union all
    select N'李四',N'语文',65 union all
    select N'李四',N'数学',77 union all
    select N'李四',N'英语',65 union all
    select N'李四',N'物理',85 
    Go
    --2000方法:
    --动态:declare @s nvarchar(4000)
    set @s=''
    Select     @s=@s+','+quotename([Course])+'=max(case when [Course]='+quotename([Course],'''')+' then [Score] else 0 end)'
    from Class group by[Course]
    exec('select [Student]'+@s+' from Class group by [Student]')
    --生成静态:select 
        [Student],
        [数学]=max(case when [Course]='数学' then [Score] else 0 end),
        [物理]=max(case when [Course]='物理' then [Score] else 0 end),
        [英语]=max(case when [Course]='英语' then [Score] else 0 end),
        [语文]=max(case when [Course]='语文' then [Score] else 0 end) 
    from 
        Class 
    group by [Student]GO
    --动态:declare @s nvarchar(4000)
    Select     @s=isnull(@s+',','')+quotename([Course]) from Class group by[Course]
    exec('select * from Class pivot (max([Score]) for [Course] in('+@s+'))b')--生成静态:
    select * 
    from 
        Class 
    pivot 
        (max([Score]) for [Course] in([数学],[物理],[英语],[语文]))b--生成格式:
    /*
    Student 数学          物理          英语          语文
    ------- ----------- ----------- ----------- -----------
    李四      77          85          65          65
    张三      87          90          82          78(2 行受影响)
    */------------------------------------------------------------------------------------------
    go
    --加上总成绩(学科平均分)--2000方法:
    动态:declare @s nvarchar(4000)
    set @s=''
    Select     @s=@s+','+quotename([Course])+'=max(case when [Course]='+quotename([Course],'''')+' then [Score] else 0 end)'
    from Class group by[Course]
    exec('select [Student]'+@s+',[总成绩]=sum([Score])  from Class group by [Student]')--加多一列(学科平均分用avg([Score]))--生成动态:select 
        [Student],
        [数学]=max(case when [Course]='数学' then [Score] else 0 end),
        [物理]=max(case when [Course]='物理' then [Score] else 0 end),
        [英语]=max(case when [Course]='英语' then [Score] else 0 end),
        [语文]=max(case when [Course]='语文' then [Score] else 0 end),
        [总成绩]=sum([Score]) --加多一列(学科平均分用avg([Score]))
    from 
        Class 
    group by [Student]go--2005方法:--动态:declare @s nvarchar(4000)
    Select     @s=isnull(@s+',','')+quotename([Course]) from Class group by[Course] --isnull(@s+',','') 去掉字符串@s中第一个逗号
    exec('select [Student],'+@s+',[总成绩] from (select *,[总成绩]=sum([Score])over(partition by [Student]) from Class) a 
    pivot (max([Score]) for [Course] in('+@s+'))b ')--生成静态:select 
        [Student],[数学],[物理],[英语],[语文],[总成绩] 
    from 
        (select *,[总成绩]=sum([Score])over(partition by [Student]) from Class) a --平均分时用avg([Score])
    pivot 
        (max([Score]) for [Course] in([数学],[物理],[英语],[语文]))b --生成格式:/*
    Student 数学          物理          英语          语文          总成绩
    ------- ----------- ----------- ----------- ----------- -----------
    李四      77          85          65          65          292
    张三      87          90          82          78          337(2 行受影响)
    */go--2、列转行
    --> --> (Roy)生成測試數據if not object_id('Class') is null
        drop table Class
    Go
    Create table Class([Student] nvarchar(2),[数学] int,[物理] int,[英语] int,[语文] int)
    Insert Class
    select N'李四',77,85,65,65 union all
    select N'张三',87,90,82,78
    Go--2000:--动态:declare @s nvarchar(4000)
    select @s=isnull(@s+' union all ','')+'select [Student],[Course]='+quotename(Name,'''')--isnull(@s+' union all ','') 去掉字符串@s中第一个union all
    +',[Score]='+quotename(Name)+' from Class'
    from syscolumns where ID=object_id('Class') and Name not in('Student')--排除不转换的列
    order by Colid
    exec('select * from ('+@s+')t order by [Student],[Course]')--增加一个排序--生成静态:
    select * 
    from (select [Student],[Course]='数学',[Score]=[数学] from Class union all 
    select [Student],[Course]='物理',[Score]=[物理] from Class union all 
    select [Student],[Course]='英语',[Score]=[英语] from Class union all 
    select [Student],[Course]='语文',[Score]=[语文] from Class)t 
    order by [Student],[Course]go
    --2005:--动态:declare @s nvarchar(4000)
    select @s=isnull(@s+',','')+quotename(Name)
    from syscolumns where ID=object_id('Class') and Name not in('Student') 
    order by Colid
    exec('select Student,[Course],[Score] from Class unpivot ([Score] for [Course] in('+@s+'))b')go
    select 
        Student,[Course],[Score] 
    from 
        Class 
    unpivot 
        ([Score] for [Course] in([数学],[物理],[英语],[语文]))b--生成格式:
    /*
    Student Course Score
    ------- ------- -----------
    李四      数学      77
    李四      物理      85
    李四      英语      65
    李四      语文      65
    张三      数学      87
    张三      物理      90
    张三      英语      82
    张三      语文      78(8 行受影响)
    */
      

  2.   

    ---------------------------------
    --  Author: liangCK 小梁
    ---------------------------------
     
    --> 生成测试数据: @T
    DECLARE @T TABLE (列1 VARCHAR(4),列2 VARCHAR(2))
    INSERT INTO @T
    SELECT 'AAAA','BB' UNION ALL
    SELECT 'AAAA','DD' UNION ALL
    SELECT 'BBBB','EE' UNION ALL
    SELECT 'BBBB','FF' UNION ALL
    SELECT 'BBBB','GG' UNION ALL
    SELECT 'CCCC','HH'--SQL查询如下:SELECT
        列1,
        列2=MAX(CASE WHEN RID=1 THEN 列2 ELSE '' END),
        列3=MAX(CASE WHEN RID=2 THEN 列2 ELSE '' END),
        列4=MAX(CASE WHEN RID=3 THEN 列2 ELSE '' END)
    FROM (
        SELECT
            *,
            RID=ROW_NUMBER() OVER(PARTITION BY 列1 ORDER BY 列2)
        FROM @T
    ) AS A
    GROUP BY 列1/*
    列1   列2   列3   列4
    ---- ---- ---- ----
    AAAA BB   DD   
    BBBB EE   FF   GG
    CCCC HH        (3 行受影响)
    */
      

  3.   

    如果是不确定有多少个的,那得用动态SQL,这个,自己到推荐(精华)找。
      

  4.   


    你这是2005的,我的是2000,而且不确定有多少个,精华贴里的是把行转为列标题。
    做了些调整得到下面的结果,但我想要的不是这样:列1  BB   DD   EE   FF   GG   HH
    ---- ---- ---- ---- ---- ---- ----
    AAAA BB   DD   
    BBBB           EE   FF
    CCCC                          HH
      

  5.   

    ---------------------------------
    --  Author: liangCK 小梁
    ---------------------------------
     
    --> 生成测试数据: #T
    IF OBJECT_ID('tempdb.dbo.#T') IS NOT NULL DROP TABLE #T
    CREATE TABLE #T (列1 VARCHAR(4),列2 VARCHAR(2))
    INSERT INTO #T
    SELECT 'AAAA','BB' UNION ALL
    SELECT 'AAAA','DD' UNION ALL
    SELECT 'BBBB','EE' UNION ALL
    SELECT 'BBBB','FF' UNION ALL
    SELECT 'BBBB','GG' UNION ALL
    SELECT 'CCCC','HH'--SQL查询如下:DECLARE @sql VARCHAR(8000)
    DECLARE @i INTSELECT @sql='',@i=1SELECT 
        @sql=@sql+',MAX(CASE WHEN RID='+RTRIM(RID)+' THEN 列2 ELSE '''' END) AS [列'+RTRIM(@i)+']',
        @i=@i+1
    FROM(
        SELECT DISTINCT
            RID
        FROM(
            SELECT 
                RID=(
                        SELECT COUNT(*)
                        FROM #T
                        WHERE 列1=A.列1
                            AND 列2>=A.列2
                    )
            FROM #T AS A
        ) AS T
    ) AS AEXEC('
        SELECT 列1'+@sql+'
        FROM(
            SELECT
                列1,
                列2,
                RID=(
                        SELECT COUNT(*)
                        FROM #T
                        WHERE 列1=A.列1
                            AND 列2>=A.列2
                    ) 
            FROM #T AS A
        ) AS A
        GROUP BY 列1
    ')/*
    列1   列1   列2   列3
    ---- ---- ---- ----
    AAAA DD   BB   
    BBBB GG   FF   EE
    CCCC HH        (3 行受影响)
    */
      

  6.   

    牛人,不过生成的列有可能不连续,举例如下:列1   列1   列2   列3   列4   列5
    ----  ----  ----  ----  ----  ----
    AAAA DD   BB            EE
    BBBB GG   FF   EE
    CCCC      GG            HH