SSMS
 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. DBeaver
  2.   
  3. phpMyAdmin
  4.   
  5. Navicat
  6.   
  7. SSMS
  8.   
  9. MySQL Workbench
  10.   
  11. SQLyog
  1. SQL Azure:SMO изключение при скриптиране на обекти в SSMS 2008 R2

  2. Спрете изпълнението на SQL Server, докато не е необходимо

  3. SSMS премахва коментарите преди BEGIN от моите съхранени процедури

  4. Sql Server Management Studio се затваря веднага след стартиране

  5. Разделяне на стойност на едно поле на множество стойности на колони с фиксирана дължина в T-SQL