我试图将一个表格旋转90度:将列转换为行。不允许使用PIVOT,因为PIVOT需要聚合函数。
例如,我有一个包含以下列的表:
ID int,
ISO char(2),
Text varchar(255)。
所以我有这个:
ID ISO Text -- --- ---- 1 DE Auto 2 EN Car
我想要得到如下结果:
ID EN DE -- --- ---- 1 Car Auto
你该如何实现呢?
我试图将一个表格旋转90度:将列转换为行。不允许使用PIVOT,因为PIVOT需要聚合函数。
例如,我有一个包含以下列的表:
ID int,
ISO char(2),
Text varchar(255)。
所以我有这个:
ID ISO Text -- --- ---- 1 DE Auto 2 EN Car
我想要得到如下结果:
ID EN DE -- --- ---- 1 Car Auto
你该如何实现呢?
这个答案是Frantisek的, 我只是复制过来纠正错误(我不能直接编辑)。
基本上,你使用那个解决方案,稍作修改:
SELECT
max(DE) as DE, max(EN) as EN
FROM
test
PIVOT (MAX([text]) FOR ISO in (DE,EN)) p
MAX
聚合,这将丢失数据。SELECT
ID, DE, EN
FROM
TextTable
PIVOT(MAX([text]) FOR ISO IN (DE,EN)) p
可以使用MAX聚合函数在文本上使用PIVOT。
select
t.num_claim_no,
rtrim (xmlagg (xmlelement (e, t.txt_remarks ||'@'|| t.dat_update_date || ' , ')).extract ('//text()'), ',') Remarks,
rtrim (xmlagg (xmlelement (e, t.num_update_no || ' , ')).extract ('//text()'), ',') SrlNo
from
gc_clm_gen_info t
where t.txt_remarks is not null
group by
t.num_claim_no
;
ALTER DATABASE myDatabase SET COMPATIBILITY_LEVEL = 90;
这将把兼容性设置为SQLServer 2005,上述查询将执行而不会出现语法错误。
查询,即使其他答案证明您可以使用PIVOT,也不使用PIVOT :)
SELECT
MAX(DE.Text) AS DE,
MAX(EN.Text) AS EN
FROM TextTable AS TT
LEFT JOIN TextTable AS DE
ON DE.ID = TT.ID
AND DE.ISO = 'DE'
LEFT JOIN TextTable AS EN
ON EN.ID = TT.ID
AND EN.ISO = 'EN'
既然您明确要求非枢轴解决方案:如果您知道行中将有哪些ISO,则应该可以使用此方法。我将表格称为“Test”。
declare @temp table ([ID] int, [de] varchar(255), [en] varchar(255)) -- add ISOs if necessary
INSERT @temp
SELECT distinct [ID], '', '' from Test -- ADD '' for other ISOs if necessary
DECLARE c CURSOR read_only
FOR SELECT [ID], [ISO], [Text] from test
DECLARE @ID int, @ISO char(2), @Text varchar(255)
OPEN c
FETCH NEXT FROM c INTO @ID, @ISO, @Text
WHILE (@@fetch_status <> -1)
BEGIN
IF (@@fetch_status <> -2)
BEGIN
UPDATE @temp
SET [DE] = case when @ISO = 'DE' then @Text else [de] end,
[EN] = case when @ISO = 'EN' then @Text else [en] end
-- add ISOs if necessary
WHERE [ID] = @ID
END
FETCH NEXT FROM c INTO @ID, @ISO, @Text
END
CLOSE c
DEALLOCATE c
SELECT * FROM @temp