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

sql:列としての行の値

    あなたの問題はダイナミックピボットを使用して解決することができます。この記事

    これを試してください

    DECLARE @t TABLE(Id_Contract INT, Dt DATETIME,Amount INT)
    INSERT INTO @t SELECT 1,'2012-01-01 00:00:00.000',500
    INSERT INTO @t SELECT 1,'2012-03-01 00:00:00.000',450
    INSERT INTO @t SELECT 2,'2012-09-01 00:00:00.000',300
    INSERT INTO @t SELECT 3,'2012-08-01 00:00:00.000',750
    
    DECLARE @cols AS VARCHAR(MAX), @query  AS VARCHAR(MAX);
    
    SELECT 
        Id_Contract
        , LEFT(DATENAME(month,Dt),3) + ' ' + DATENAME(Year,Dt) AS Month_Year_Name
        ,Amount
    INTO #Temp
    FROM @t 
    WHERE Dt BETWEEN  '01/01/2012' AND '03/31/2012'
    
    SELECT  @cols = STUFF(( SELECT DISTINCT 
                                   '],[' +   t2.Month_Year_Name
                            FROM    #Temp AS t2
                            ORDER BY '],[' + t2.Month_Year_Name
                            FOR XML PATH('')
                          ), 1, 2, '') + ']'
    
    SET @query = 'SELECT Id_Contract, ' + @cols + ' FROM 
                (
                    SELECT
                         Id_Contract
                        , Amount
                        , Month_Year_Name
                    FROM #Temp
               ) x
                PIVOT 
                (
                     MAX(amount)
                     FOR Month_Year_Name in (' + @cols + ')
                ) p '
    EXECUTE(@query)
    DROP TABLE #Temp
    

    //結果

    Id_Contract Jan 2012    Mar 2012
    1           500         450
    

    編集

    テストデータについては、

    DECLARE @t TABLE(Id_Contract INT, Dt DATETIME,Amount INT) 
    INSERT INTO @t SELECT 1,'2012-01-01 00:00:00.000',500 
    INSERT INTO @t SELECT 1,'2012-03-01 00:00:00.000',450 
    INSERT INTO @t SELECT 2,'2012-03-01 00:00:00.000',450 
    INSERT INTO @t SELECT 3,'2012-08-01 00:00:00.000',750 
    

    出力は

    です
    Id_Contract Jan 2012    Mar 2012
    1              500          450
    2              NULL         450
    

    要件を満たしているかどうか教えてください。



    1. PRIMARY KEYでJOINを使用する場合、どのインデックスを使用する必要がありますか

    2. パッケージにOracleの状態があるかどうかを判断する方法はありますか?

    3. Homebrewを使用して[メール保護]のKegインストールにPostgisをインストールするにはどうすればよいですか?

    4. PHP MYSQL UPDATEが存在する場合、またはINSERTが存在しない場合は?