sql >> Databasteknik >  >> Database Tools >> SSMS

Hur man pivoterar utan att känna till fasta kolumner i T-SQL

Demo på db<>fiol

Du kan använda ROW_NUMBER() för att markera antalet värden, t.ex.:1, 2, 3 .

Observera att :ORDER BY [Balance] DESC för att få det genererade värdet som du vill.

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;

Utdata

Uppdaterad

Sedan sammanlänkning av strängar är odokumenterad och opålitlig . Det fungerar inte alltid som förväntat . Så du bör lösa med två lösningar nedan

  1. Använd STRING_AGG (Från SQL Server 2017 och senare)
SELECT STRING_AGG(QUOTENAME(Col), ', ')
from (SELECT DISTINCT Col FROM #b) A
// Output: [1], [2], [3]
  1. Använd XML-tillägg
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],

Tack @GarethDs kommentar. Kolla in den på db<>fiol



  1. MySQL och PhpMyAdmin config.inc.php Lösenordsproblem på MAMP

  2. Wamp Server phpMyAdmin är inte på engelska

  3. phpMyadmin-databasimportfel #1046 - Ingen databas har valts

  4. Hur felsöker eller stegar du igenom koden i SQL Server Management Studio 18?