在循环中连接表

时间:2014-01-20 09:54:07

标签: sql sql-server sql-server-2008

我想创建一个查询,它会给我一个包含多列的表作为一列中不同值的数量

我的原始表格如下:

tester_ID|trial|result

example for data

并非每个测试者都必须为每次试验都有结果

我想做出类似的事情:

tester_ID|trial 1|trial 2|trial ....

example for possible result

问题是我不知道如何在循环中进行连接 这将覆盖所有测试人员,并产生用每个测试人员编写结果的行

2 个答案:

答案 0 :(得分:0)

希望这能帮到你

create table tableA
(
    tester_ID int,
    trial int,
    result varchar
);

insert into tableA values
(1,   10, 'P'),
(2,   12, 'q'),
(3,   13, 'w'),
(4,   14, 'e'),
(5,   15, 'h'),

静态版本,具有硬编码以进行透视的值:

select *
from 
(
    select tester_ID , 
    'Trail_' + cast(ROW_NUMBER() over(PARTITION by tester_ID order by tester_ID  desc) as varchar(10)) col            
    from tableA
) x
pivot
(
    max(value)
    for col in ([Trail_1], [Trail_2], [Trail_3], [Trail_4], 
                [Trail_5])
) p

或者您必须使用动态版

DECLARE @cols AS NVARCHAR(MAX),
@query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT ',' + QUOTENAME( 'Trail_' + cast(x.rn as varchar(10))) 
                    from tableA
                    cross apply 
                    (
                        select ROW_NUMBER() over(PARTITION by tester_ID order by tester_ID desc) rn
                        from tableA
                    ) x
                    group by x.rn
                    order by x.rn
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT id, ' + @cols + ' from 
             (
                select tester_ID, 
                    ''Timeline_'' + cast(ROW_NUMBER() over(PARTITION by tester_ID order by tester_ID desc) as varchar(10)) col

                from tableA
            ) x
            pivot 
            (
                max(value)
                for col in (' + @cols + ')
            ) p '

execute(@query)

答案 1 :(得分:0)

如果我理解正确你想要这样的东西:

SELECT r.tester_ID,CONCAT(r.Trail_1,r.Trail_2,r.Trail_3,r.Trail_4,r.Trail_5) AS trails
FROM (
    SELECT *
    FROM (
            SELECT tester_ID , 
            'Trail_' + CAST(DENSE_RANK() OVER(ORDER BY trial DESC) AS VARCHAR(10)) col            
            FROM tableA
            ) AS x
            PIVOT
            (
                MAX(col)
                FOR col IN ([Trail_1],[Trail_2],[Trail_3],[Trail_4],[Trail_5])
            ) AS p 
        ) AS r

如果没有一个tester_ID有两条小道或试验,那就没关系了。

P.S。也许它可以被优化;)