我想创建一个查询,它会给我一个包含多列的表作为一列中不同值的数量
我的原始表格如下:
tester_ID|trial|result
并非每个测试者都必须为每次试验都有结果
我想做出类似的事情:
tester_ID|trial 1|trial 2|trial ....
问题是我不知道如何在循环中进行连接 这将覆盖所有测试人员,并产生用每个测试人员编写结果的行
答案 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。也许它可以被优化;)