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

SQLServer2005で行を列に変換するにはどうすればよいですか

    同様の質問がありますここ 、こちら stackoverflowで回答しました。

    演算子PIVOT を使用する必要があります これを達成するためのクエリで。これを行う方法の例と説明を次に示します。この例は、 これ ソース。

    ---I assumed your tablename as TESTTABLE---
    DECLARE @cols NVARCHAR(2000)
    DECLARE @query NVARCHAR(4000)
    
    SELECT  @cols = STUFF(( SELECT DISTINCT TOP 100 PERCENT
                                    '],[' + t.Name
                            FROM    TESTTABLE AS t
                            ORDER BY '],[' + t.Name
                            FOR XML PATH('')
                          ), 1, 2, '') + ']'
    
    SET @query = N'SELECT '+ @cols +' FROM
    (SELECT t1.Name , t1.Count FROM TESTTABLE AS t1) p
    PIVOT (MAX([Count]) FOR Name IN ( '+ @cols +' ))
    AS pvt;'
    
    EXECUTE(@query)
    

    説明

    1.クエリの最初の部分

    SELECT  @cols = STUFF(( SELECT DISTINCT TOP 100 PERCENT
                            '],[' + t.Name
                    FROM TESTTABLE AS t
                    ORDER BY '],[' + t.Name
                    FOR XML PATH('')
                  ), 1, 2, '') + ']'
    

    次のように、名前列の値を1行にまとめた結果がフラットになります

    [Cheryl],[Drew],[Karen],[Kath],[Kirk],[Matt]  
    

    STUFFとXMLPATHの詳細については、こちら> およびこちら

    2. SELECT + @cols + FROM 最終結果セットの列名としてすべての行を選択します(pvt-ステップ3)

    つまり

    Select [Chery],[Drew],[Morgan],[Kath],[Kirk],[Matt] 
    

    3.このクエリは、クロス集計結果を作成するために必要なデータのすべての行をプルします。クエリ後の(p)は、結果の一時テーブルを作成します。このテーブルを使用して、ステップ1のクエリを満たすことができます。

    (SELECT t1.Name, t1.Count FROM  TESTTABLE AS t1) p
    

    4.PIVOT式

    PIVOT (MAX (Count) FOR Name IN ( @cols) AS pvt
    

    実際の要約を実行し、結果をpvtと呼ばれる一時テーブルに

    として配置します。
    Chery | Drew | Morgon | Kath | Kirk | Matt  
    -------------------------------------------  
    257     1500     13      500    200    76
    


    1. テキストの位置を見つけ、テキストを抽出して、MySQLの新しい列に挿入します

    2. SQLはSELECTを制限しますが、JOINは制限しません

    3. JDBCを使用するときにSQLステートメントのロギングを有効にする方法

    4. SQLで重複を表示しない方法