sql >> データベース >  >> RDS >> Sqlserver

PIVOT を使用して列の値を列として選択する

    要件は完全には明確ではありませんが、 c という名前の新しい列を作成しようとしているようです 次に row_number() 関連 -- c1、c2 c3 など .

    サブクエリで次を使用する場合:

    SELECT Val1, Val2, 'C'+ cast(row_number() over(Val2 で分割し、val1 で分割) as varchar(10)) colFROM TEMP1  

    SQL Fiddle with Demo を参照してください

    結果は次のようになります:

    <プレ>| VAL1 | VAL2 | COL |------------------------------------| S01 | 00731 | C1 || S02 | 00731 | C2 || S03 | 00731 | C3 || S04 | 00731 | C4 || S05 | 00731 | C5 || S06 | 00731 | C6 || S07 | 00731 | C7 || S07 | 00731 | C8 || S08 | 00731 | C9 || S09 | 00731 | C10 || S04 | 00741 | C1 || S01 | 00746 | C1 || S01 | 00770 | C1 || S01 | 00771 | C1 || S02 | 00771 | C2 |

    PIVOT したい結果のようです .次に、PIVOT を適用します。

    を使用してこれに
    SELECT Val2, c1, c2, c3, c4, c5, c6, c7, c8, c9, c10FROM( SELECT Val1, Val2, 'C'+ cast(row_number() over(Val2 による分割 order by val1) as varchar(10)) col FROM TEMP1) srcPIVOT( MAX(Val1) FOR col IN (C1, C2, C3, C4, C5, C6, C7, C8, C9, C10)) piv;  

    デモによる SQL Fiddle を参照してください。 .最終結果は次のとおりです。

    <プレ>| VAL2 | C1 | C2 | C3 | C4 | C5 | C6 | C7 | C8 | C9 | C10 |------------------------------------------------ ------------------------------------------------| 00731 | S01 | S02 | S03 | S04 | S05 | S06 | S07 | S07 | S08 | S09 || 00741 | S04 | (ヌル) | (ヌル) | (ヌル) | (ヌル) | (ヌル) | (ヌル) | (ヌル) | (ヌル) | (ヌル) || 00746 | S01 | (ヌル) | (ヌル) | (ヌル) | (ヌル) | (ヌル) | (ヌル) | (ヌル) | (ヌル) | (ヌル) || 00770 | S01 | (ヌル) | (ヌル) | (ヌル) | (ヌル) | (ヌル) | (ヌル) | (ヌル) | (ヌル) | (ヌル) || 00771 | S01 | S02 | (ヌル) | (ヌル) | (ヌル) | (ヌル) | (ヌル) | (ヌル) | (ヌル) | (ヌル) |

    注:ORDER BY val1 を実行しているため、私の結果は、目的の結果として要求されているものとは少し異なります。 S07 の原因となる グループ化される値。

    要求しない限り、データベース内のデータの順序はありません。そのため、S07 のいずれかが 値は C10 として表示されます .以下を使用して結果を取得できますが、保証はありません 結果が常に正しい順序になること:

    SELECT Val2, c1, c2, c3, c4, c5, c6, c7, c8, c9, c10FROM( SELECT Val1, Val2, 'C'+ cast(row_number() over(Val2 による分割 order by (1)) as varchar(10)) col FROM TEMP1) srcPIVOT( MAX(Val1) FOR col IN (C1, C2, C3, C4, C5, C6, C7, C8, C9, C10)) piv;  

    デモによる SQL Fiddle を参照してください . order by (select 1) の使用 データの順序を変更しますが、常にその順序になることを保証するものではありません。結果は次のとおりです。

    <プレ>| VAL2 | C1 | C2 | C3 | C4 | C5 | C6 | C7 | C8 | C9 | C10 |------------------------------------------------ ------------------------------------------------| 00731 | S01 | S02 | S03 | S04 | S05 | S06 | S07 | S08 | S09 | S07 || 00741 | S04 | (ヌル) | (ヌル) | (ヌル) | (ヌル) | (ヌル) | (ヌル) | (ヌル) | (ヌル) | (ヌル) || 00746 | S01 | (ヌル) | (ヌル) | (ヌル) | (ヌル) | (ヌル) | (ヌル) | (ヌル) | (ヌル) | (ヌル) || 00770 | S01 | (ヌル) | (ヌル) | (ヌル) | (ヌル) | (ヌル) | (ヌル) | (ヌル) | (ヌル) | (ヌル) || 00771 | S01 | S02 | (ヌル) | (ヌル) | (ヌル) | (ヌル) | (ヌル) | (ヌル) | (ヌル) | (ヌル) |

    1. varbitをintにキャストする他の方法は?そしてbigint?

    2. mysqlにはデータベースの数に制限がありますか?

    3. 2つの異なるテーブルの主キーを参照するPOSTGRESQL外部キー

    4. Oracleのテーブルで重複する値を見つけるにはどうすればよいですか?