按 ID分组把值显示到一行,值不会超过5个,值的排列不要求顺序
格式
ID 值
A 1
A 2
B 3
B 4
B 5
C 6
C 7
……
显示
ID  列1 列2 列3 列4 列5 
A     1    2
B     3    4    5
C     6    7
……

解决方案 »

  1.   


    --测试数据
    IF OBJECT_ID('tempdb..#tab') IS NOT NULL
    DROP TABLE #tab
    CREATE TABLE #tab(
    id VARCHAR(20),
    NAME VARCHAR(20)
    )
    INSERT INTO #tab
    SELECT 'A','1' UNION ALL
    SELECT 'A','2' UNION ALL
    SELECT 'A','3' UNION ALL
    SELECT 'B','4' UNION ALL
    SELECT 'B','5' UNION ALL
    SELECT 'C','6' UNION ALL
    SELECT 'C','7' UNION ALL
    SELECT 'C','8' UNION ALL
    SELECT 'C','9'
    --测试数据结束DECLARE @name     VARCHAR(MAX),
            @sql      VARCHAR(MAX)
    SET @name = STUFF(
            (
                SELECT DISTINCT ',[' + [rn] + ']'
                FROM   (
                           SELECT *,
                                  '列' + CAST(
                                      ROW_NUMBER() OVER(PARTITION BY id ORDER BY NAME) 
                                      AS VARCHAR(20)
                                  ) AS rn
                           FROM   #tab
                       )a FOR XML PATH('')
            ),
            1,
            1,
            ''
        )
    SET @sql = 
        'SELECT * from (SELECT * ,''列''+cast(row_number () over(PARTITION BY id ORDER BY NAME) as VARCHAR(20)) as rn FROM #tab)a pivot(max(name) for rn in('
        + @name + '))a'EXEC (@sql)id                   列1                   列2                   列3                   列4
    -------------------- -------------------- -------------------- -------------------- --------------------
    A                    1                    2                    3                    NULL
    B                    4                    5                    NULL                 NULL
    C                    6                    7                    8                    9下次发帖记得给分,不然都没人理你,你看是不是。还好CSDN有我这样的好人啊,哈哈。
      

  2.   

    既然数目固定,那就写死算了。
    select  ID,
            max(case when rn=1 then value else '' end) as col_1,
            max(case when rn=2 then value else '' end) as col_2,
            max(case when rn=3 then value else '' end) as col_3,
            max(case when rn=4 then value else '' end) as col_4,
            max(case when rn=5 then value else '' end) as col_5
    from
    (select *,ROW_NUMBER() over (partition by id order by value) as rn from table) as A
    group by id
      

  3.   

    上周吧。
    CSDN没发消息通知, 只是发了2个公告贴子。
    http://bbs.csdn.net/topics/392275029
    http://bbs.csdn.net/topics/392275720
      

  4.   

    CSDN这种做法确实很恶心
      

  5.   

    老总没钱花了, 找俺们募捐
    还好了,不用太生气,,反正我的分够用的,,我都不怎么用,,需要的话,我可以分享点,,我们的分肯定是够了, 新人就惨, 现在好多人都得花钱买C币来下载、发贴了。
    有点担心这样下去人气是不是会下降
    总体感觉现在CSDN论坛人气是在下降,,,博客更是,,,不知道在做什么
      

  6.   

    老总没钱花了, 找俺们募捐
    哈哈,我都把c币去抽奖了,啥都没抽到,完全是骗人的,csdn越来越会扯淡了
      

  7.   

    如果列数可控,可以直接写死,否则可以用动态语句构造SQL,下面是用pivot的例子with t(ID,data)AS(
        SELECT 'A','1' UNION ALL
        SELECT 'A','2' UNION ALL
        SELECT 'A','3' UNION ALL
        SELECT 'B','4' UNION ALL
        SELECT 'B','5' UNION ALL
        SELECT 'C','6' UNION ALL
        SELECT 'C','7' UNION ALL
        SELECT 'C','8' UNION ALL
        SELECT 'C','9'
    )
    select * from (
        select *,N'列'+LTRIM(row_number()over(partition by ID order by data)) as seq from t
    ) as x pivot (max(data) for seq in ([列1],[列2],[列3],[列4],[列5])) as p
    +----+----+----+------+------+------+
    | ID | 列1 | 列2 | 列3   | 列4   | 列5   |
    +----+----+----+------+------+------+
    | A  | 1  | 2  | 3    | NULL | NULL |
    | B  | 4  | 5  | NULL | NULL | NULL |
    | C  | 6  | 7  | 8    | 9    | NULL |
    +----+----+----+------+------+------+
      

  8.   

    http://www.cnblogs.com/aspnethot/articles/1762665.html