sql >> データベース >  >> Database Tools >> SSMS

T-SQLの固定列を知らずにピボットする方法

    db<>fiddleのデモ

    ROW_NUMBER() 値の数をマークするには、例:1, 2, 3

    注意ORDER BY [Balance] DESC 必要に応じて生成された値を取得します。

    DECLARE 
        @columns NVARCHAR(MAX) = '',
        @sql     NVARCHAR(MAX) = '';
    
    
     SELECT Customer, Balance, Col = ROW_NUMBER() OVER (PARTITION BY Customer ORDER BY [Balance] DESC)
     into #b
     FROM #a
    
    SELECT @columns += QUOTENAME(Col) + ','
    from (SELECT DISTINCT Col FROM #b) A
    
    -- remove the last comma
    SET @columns = LEFT(@columns, LEN(@columns) - 1);
    
    
    SET @sql = 'SELECT * FROM ( SELECT Customer, Balance, Col FROM  #b) src PIVOT( MAX([Balance]) FOR Col IN ('+ @columns +')) AS pivot_table;';
    
    -- execute the dynamic SQL
    EXECUTE sp_executesql @sql;
    

    出力

    更新

    文字列を連結してから文書化されておらず、信頼性が低い 。常に期待どおりに機能するとは限りません 。したがって、以下の2つの解決策で解決する必要があります

    1. STRING_AGG (SQL Server 2017以降)
    SELECT STRING_AGG(QUOTENAME(Col), ', ')
    from (SELECT DISTINCT Col FROM #b) A
    // Output: [1], [2], [3]
    
    1. XML拡張機能
    DECLARE  @columns NVARCHAR(MAX) = ''
    SELECT @columns = (
      SELECT QUOTENAME(Col) + ', '
      FROM (SELECT DISTINCT Col FROM #b) A
    
      FOR XML PATH(''), TYPE
                       ).value('.','varchar(max)')
    SELECT @columns 
    // Output: [1], [2], [3],
    

    @GarethDのコメントに感謝します。 db <>fiddle で確認してください。



    1. MYSQL列を条件付きで選択する

    2. SQL ServerManagementStudioのスキーマビュー

    3. SQLグループ化アカウント番号と小計と総計の取得

    4. sun.jdbc.odbc.JdbcOdbcDriverをダウンロードする場所(出力csvをSpoonからSSMSに接続しようとしています)