SQL Server 2005, превращайте столбцы в строки - PullRequest
7 голосов
/ 09 января 2009

Я пытаюсь повернуть таблицу на 90 градусов: сделать столбцы строк. PIVOT не допускается, поскольку PIVOT требует агрегатных функций.

Пример: У меня есть таблица с колонками:
ID int,
ISO char (2),
Текст varchar (255).

Итак, у меня есть это:

ID ISO Text
-- --- ----
 1 DE  Auto
 2 EN  Car

Я бы хотел получить следующее:

ID EN  DE
-- --- ----
 1 Car Auto

Как вам этого добиться?

Ответы [ 6 ]

5 голосов
/ 09 января 2009

Этот ответ на самом деле от Франтишека, я просто копирую здесь, чтобы исправить ошибку (я не могу редактировать напрямую).

По сути, вы используете это решение с настройкой:

SELECT 
    max(DE) as DE, max(EN) as EN 
FROM 
    test 
PIVOT (MAX([text]) FOR ISO in (DE,EN)) p

Это позволит получить содержимое в одну строку. Кроме того, он удаляет идентификатор, так как не имеет смысла, если вы хотите одну строку (нет логики, чтобы указать, что делать с ним при объединении в одну строку).

Также предполагается, что значения в столбце ISO уникальны, в противном случае данные будут потеряны из-за MAX агрегата .

2 голосов
/ 09 января 2009

Я нашел решение следующим образом:

SELECT 
    ID, DE, EN
FROM 
    TextTable 
PIVOT(MAX([text]) FOR ISO IN (DE,EN)) p

Возможно использовать PIVOT с функцией агрегирования MAX над текстом.

1 голос
/ 20 февраля 2012
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
;
1 голос
/ 07 февраля 2012

Если вы попробуете это решение и получите синтаксическую ошибку, попробуйте установить режим совместимости вашей базы данных с помощью

ALTER DATABASE myDatabase SET COMPATIBILITY_LEVEL = 90;

Это установит совместимость SQLServer 2005, и вышеупомянутые запросы будут выполняться без синтаксической ошибки.

1 голос
/ 09 января 2009

Запрос без 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'
0 голосов
/ 09 января 2009

Поскольку вы явно просили решение без опорных точек: это должно работать, если вы знаете, какие 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
...