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

SQLの行を列に転置する

    私はこのコードを試しました。動作するかどうかを確認してお知らせください

    私はそれがそれほど良く見えないことを知っています。また、パフォーマンスがどのようになるかわかりません。

    --Can have more columns like A,B,...
    DECLARE @tbl TABLE
    (
    TOTAL INT,
    CHARGE FLOAT,
    PAYMENT FLOAT,
    MONTHYEAR VARCHAR(50)
    )
    
    
    --Test data
    INSERT INTO @tbl SELECT 661, 157832.24, 82967.80, 'Oct2013'
    INSERT INTO @tbl SELECT 612,     95030.52,    17824.28, 'Nov2013'
    INSERT INTO @tbl SELECT 584     ,90256.35,    16732.91, 'Dec2013'
    
    --Can be a physical table
    CREATE TABLE #FinalTbl 
    (
    DATA VARCHAR(100)
    )
    
    --inserted hardcode records in data column. To add it dynamically you would need to loop through information_schema.columns
    --SELECT *
    --FROM information_schema.columns
    --WHERE table_name = 'tbl_name'
    INSERT INTO #FinalTbl
    VALUES ('TOTAL')
    
    INSERT INTO #FinalTbl
    VALUES ('CHARGE')
    
    INSERT INTO #FinalTbl
    VALUES ('PAYMENT')
    
    DECLARE @StartCount INT, @TotalCount INT, @Query VARCHAR(5000), @TOTAL INT,@CHARGE FLOAT,@PAYMENT FLOAT,@MONTHYEAR VARCHAR(50)
    
    SELECT @TotalCount = COUNT(*) FROM @tbl;
    SET @StartCount = 1;
    
    WHILE(@StartCount <= @TotalCount)
    BEGIN
        SELECT @TOTAL = TOTAL, 
        @CHARGE = CHARGE,
        @PAYMENT = PAYMENT,
        @MONTHYEAR = MONTHYEAR  
        FROM
        (SELECT ROW_NUMBER() over(ORDER BY MONTHYEAR) AS ROWNUM, * FROM @tbl) as tbl
        WHERE ROWNUM = @StartCount
    
        SELECT @Query = 'ALTER TABLE #FinalTbl ADD ' + @MONTHYEAR + ' VARCHAR(1000)'
        EXEC (@Query)
    
        SELECT @Query = 'UPDATE #FinalTbl SET ' + @MONTHYEAR + ' = ''' + CONVERT(VARCHAR(50), @TOTAL) + ''' WHERE DATA = ''TOTAL'''
        EXEC (@Query)
    
        SELECT @Query = 'UPDATE #FinalTbl SET ' + @MONTHYEAR + ' = ''' + CONVERT(VARCHAR(50), @CHARGE) + ''' WHERE DATA = ''CHARGE'''
        EXEC (@Query)
    
        SELECT @Query = 'UPDATE #FinalTbl SET ' + @MONTHYEAR + ' = ''' + CONVERT(VARCHAR(50), @PAYMENT) + ''' WHERE DATA = ''PAYMENT'''
        EXEC (@Query)
    
        SELECT @StartCount = @StartCount + 1
    END
    
    SELECT * FROM #FinalTbl
    
    DROP TABLE #FinalTbl
    

    これがお役に立てば幸いです



    1. postgresql-Macで起動-`pg_ctl`が機能しない

    2. すべての行のテキストを検索して置換するSQLクエリ

    3. 指定されたキーが長すぎたのを修正するにはどうすればよいですか。キーの最大長は1000バイトです

    4. 9.6最も恐ろしいパッチトーナメント