7

テーブルを 90 度回転させようとしています: 列を行にします。PIVOT には集約関数が必要なため、PIVOT は許可されません。

例:
ID int、
ISO char(2)、
Text varchar(255) の列を持つテーブルがあります。

だから私はこれを持っています:

ID ISO テキスト
-- ------ ----
 1DEオート
 2 EN車

私は次のものを手に入れたいです:

ID EN DE
-- ------ ----
 1 カーオート

どうやってそれを達成しますか?

4

6 に答える 6

5

この答えは本当にfrantisekのものです、私は間違いを訂正するためにここにコピーしているだけです(私は直接編集することはできません)。

基本的に、微調整を加えて、そのソリューションを使用します。

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

これにより、コンテンツが1行になります。また、単一の行が必要な場合は意味がないため、IDは削除されます(単一の行に結合するときにIDをどう処理するかを示すロジックはありません)。

また、ISO列の値は一意であると想定されます。そうでない場合、MAX集計によりデータが失われます。

于 2009-01-09T14:58:18.887 に答える
2

私は次のような解決策を見つけました:

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

テキスト上でMAX集計機能を備えたPIVOTを使用することが可能です。

于 2009-01-09T14:53:46.663 に答える
1

この解決策を試して構文エラーが発生した場合は、次の方法でデータベースの互換性モードを設定してみてください

ALTER DATABASE myDatabase SET COMPATIBILITY_LEVEL = 90;

これにより、SQLServer 2005 との互換性が設定され、上記のクエリは構文エラーなしで実行されます。

于 2012-02-06T20:02:43.483 に答える
1

他の回答が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'
于 2009-01-09T15:14:25.843 に答える
1
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
;
于 2012-02-20T07:46:31.373 に答える
0

ピボット以外のソリューションを明示的に要求したため、行にどの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
于 2009-01-09T14:34:24.440 に答える