SQL Server 2005, превращайте столбцы в строки
Я пытаюсь повернуть таблицу на 90 градусов: сделать столбцы строк. PIVOT не допускается, поскольку PIVOT требует агрегатных функций.
Пример: у меня есть таблица со столбцами:
ID int,
ISO char (2),
Текст varchar(255).
Итак, у меня есть это:
ID ISO Text - --- ---- 1 DE Auto 2 EN Car
Я хотел бы получить следующее:
ID EN DE - --- ---- 1 Авто Авто
Как вы этого достигнете?
6 ответов
Этот ответ действительно принадлежит Франциске, я просто копирую здесь, чтобы исправить ошибку (я не могу редактировать напрямую).
По сути, вы используете это решение с настройкой:
SELECT
max(DE) as DE, max(EN) as EN
FROM
test
PIVOT (MAX([text]) FOR ISO in (DE,EN)) p
Это позволит получить содержимое в одну строку. Кроме того, он удаляет идентификатор, так как не имеет смысла, если вы хотите одну строку (нет логики, чтобы указать, что делать с ним при объединении в одну строку).
Кроме того, предполагается, что значения в столбце ISO являются уникальными, в противном случае это приведет к потере данных из-за MAX
совокупность
Я нашел решение следующим образом:
SELECT
ID, DE, EN
FROM
TextTable
PIVOT(MAX([text]) FOR ISO IN (DE,EN)) p
Можно использовать PIVOT с функцией агрегирования MAX над текстом.
Запрос без 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'
Если вы попробуете это решение и получите синтаксическую ошибку, попробуйте установить режим совместимости вашей базы данных через
ALTER DATABASE myDatabase SET COMPATIBILITY_LEVEL = 90;
Это установит совместимость к SQLServer 2005, и вышеупомянутые запросы будут выполняться без синтаксической ошибки.
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
;
Поскольку вы явно просили решение без опорных точек: это должно сработать, если вы знаете, какие ISO у вас будут в строках. Я назвал таблицу "Тест".
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