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

SQLの行から列へ

    SQLでは実行できません (動的クエリを除く)設計時に列の数(つまり、質問)がわからない場合。

    必要なデータを表形式でプルしてから、クライアント側で処理する必要があります:

    SELECT  *
    FROM    Question
    LEFT OUTER JOIN
            Response
    ON      Response.QuestionId = Question.QuestionID
    

    または、おそらくこれ( SQL Server 2005+ の場合) 、 Oracle 8i + およびPostgreSQL8.4+ ):

    SELECT  *
    FROM    (
            SELECT  q.*, ROW_NUMBER() OVER (ORDER BY questionID) AS rn
            FROM    Question q
            ) q
    LEFT OUTER JOIN
            (
            SELECT  r.*, ROW_NUMBER() OVER (PARTITION BY questionID ORDER BY ResponseID) AS rn
            FROM    Response r
            ) r
    ON      r.QuestionId = q.QuestionID
            AND q.rn = r.rn
    ORDER BY
            q.rn, q.QuestionID
    

    後者のクエリでは、この形式の結果が得られます( 4 がある場合) 質問):

    rn      question      response
    ---          ---           ---
    1     Question 1  Response 1.1
    1     Question 2  Response 2.1
    1     Question 3  Response 3.1
    1     Question 4  Response 4.1
    2     Question 1  Response 1.2
    2     Question 2  Response 2.2
    2     Question 3  NULL
    2     Question 4  Response 4.2
    3     Question 1  NULL
    3     Question 2  NULL
    3     Question 3  Response 3.3
    3     Question 4  NULL
    

    、これは、 rnを使用してデータを表形式で出力することです。 行番号をマークします。

    rnが表示されるたびに クライアントで変更するには、 を閉じるだけです。 新しいものを開きます。

    を安全に配置できます rn ごとに同じ数または複数の行が返されることが保証されているため、結果セットの行ごとに1つ

    これは非常によくある質問です。

    SQL 動的な列数のデータを返すための適切なツールではありません。

    SQL セットで動作し、列レイアウトはセットの暗黙のプロパティです。

    C で変数のデータ型を定義するのと同じように、設計時に取得するセットのレイアウトを定義する必要があります。 。

    C 厳密に定義された変数、<​​code> SQLで動作します 厳密に定義されたセットで動作します。

    私はそれが可能な限り最良の方法であると言っているわけではないことに注意してください。 SQLのやり方です 動作します。

    更新:

    SQL Server内 、 HTMLでテーブルをプルできます データベースから直接フォーム:

    WITH    a AS
            (
            SELECT  a.*, ROW_NUMBER() OVER (PARTITION BY question_id ORDER BY id) AS rn
            FROM    answer a
            ),
            rows AS (
            SELECT  ROW_NUMBER() OVER (ORDER BY id) AS rn
            FROM    answer a
            WHERE   question_id =
                    (
                    SELECT  TOP 1 question_id
                    FROM    answer a
                    GROUP BY
                            question_id
                    ORDER BY
                            COUNT(*) DESC
                    )
            )
    SELECT  (
            SELECT  COALESCE(a.value, '')
            FROM   question q
            LEFT JOIN
                    a
            ON      a.rn = rows.rn
                    AND a.question_id = q.id
            FOR XML PATH ('td'), TYPE
            ) AS tr
    FROM    rows
    FOR XML PATH(''), ROOT('table')
    

    詳細については、ブログのこのエントリを参照してください:

    • 動的ピボット


    1. AzureSQLデータベースのパフォーマンスとサービス層の説明

    2. Android:データベースのアップグレード時にonUpgradeが呼び出されない

    3. Postgres:エラー:キャッシュされたプランは結果タイプを変更してはなりません

    4. Prismaの使い方