2014-01-20 113 views
0

我想创建一个查询,会给我一个表列数的,我在一列连接表在一个循环中

我最初的表看起来像这样不同值的数量:

tester_ID|trial|result 

example for data

而且不是每个测试都必须有结果为每个审判

我想让这样的事情:

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

example for possible result

的问题是我不知道如何使加盟循环 这将去了所有的测试,并导致在写每一个测试人员与他的结果行

+1

我真的很难理解这个问题...... Information_Schema.Columns给你一个列表在数据库(与他们的表),你可以用它来动态建立你的查询? – Liath

+0

请显示一些示例数据和预期结果。 – okrumnow

+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) 
+0

所以你知道pivoting ... –

+0

@thedarksideofthemoon我希望如此 –

+0

我认为你的问题是在'cast(ROW_NUMBER()(PARTITION由tester_ID order by tester_ID desc)':当我执行它时,我只是'Trial_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.也许它可以被优化;)

+0

谢谢,但问题是我不知道有多少试验有 –