sql >> Databáze >  >> Database Tools >> SSMS

Jak pivotovat bez znalosti pevných sloupců v T-SQL

Ukázka na db<>fiddle

Můžete použít ROW_NUMBER() pro označení počtu hodnot, např.:1, 2, 3 .

Všimněte si, že :ORDER BY [Balance] DESC abyste získali vygenerovanou hodnotu, jak si přejete.

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;

Výstup

Aktualizováno

Od zřetězení řetězců je nezdokumentovaný a nespolehlivý . Ne vždy to funguje podle očekávání . Měli byste to vyřešit pomocí 2 níže uvedených řešení

  1. Použijte STRING_AGG (Z SQL Server 2017 a novější)
SELECT STRING_AGG(QUOTENAME(Col), ', ')
from (SELECT DISTINCT Col FROM #b) A
// Output: [1], [2], [3]
  1. Použijte Rozšíření 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],

Děkuji za komentář @GarethD. Podívejte se na db<>fiddle



  1. Jak povolit automatické určování rozsahu transakcí v SQL Server Management Studio?

  2. Jaký je snadný způsob importu velké databáze do mysql pomocí phpmyadmin?

  3. Dotaz Mysql funguje v phpmyadmin, ale ne v php (k dnešnímu dni)

  4. #1146 - Tabulka 'phpmyadmin.pma__tracking' neexistuje, jak ručně deaktivovat?