SSMS
 sql >> Baza danych >  >> Database Tools >> SSMS

Jak obracać się bez znajomości stałych kolumn w T-SQL

Demo na db<>skrzypce

Możesz użyć ROW_NUMBER() aby zaznaczyć liczbę wartości, np.:1, 2, 3 .

Pamiętaj, że :ORDER BY [Balance] DESC aby uzyskać wygenerowaną wartość, jak chcesz.

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;

Wyjście

Zaktualizowano

Ponieważ łączenie ciągów jest nieudokumentowany i niewiarygodny . Nie zawsze działa zgodnie z oczekiwaniami . Więc powinieneś rozwiązać za pomocą 2 rozwiązań poniżej

  1. Użyj STRING_AGG (Z SQL Server 2017 i późniejsze)
SELECT STRING_AGG(QUOTENAME(Col), ', ')
from (SELECT DISTINCT Col FROM #b) A
// Output: [1], [2], [3]
  1. Użyj Rozszerzenia 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],

Dzięki komentarz @GarethD. Sprawdź to na db<>skrzypce



  1. DBeaver
  2.   
  3. phpMyAdmin
  4.   
  5. Navicat
  6.   
  7. SSMS
  8.   
  9. MySQL Workbench
  10.   
  11. SQLyog
  1. nie można uzyskać dostępu do serwera SQL Server Developer sp1 ssis z ssms

  2. Jak zatrzymać SSMS 2012 przed skryptowaniem SP przy użyciu sp_executesql?

  3. Jak wyświetlić wykonane zapytania w programie SQL Server Management Studio?

  4. Śledzenie ciągłych dni nieobecności z dni roboczych tylko SQL

  5. Jak ustawić wartość kolumny na NULL w SQL Server Management Studio?