SSMS
 sql >> Teknologi Basis Data >  >> Database Tools >> SSMS

Cara melakukan pivot tanpa mengetahui kolom tetap di T-SQL

Demo di db<>biola

Anda dapat menggunakan ROW_NUMBER() untuk menandai jumlah nilai, misalnya:1, 2, 3 .

Perhatikan bahwa :ORDER BY [Balance] DESC untuk mendapatkan nilai yang dihasilkan sesuai keinginan.

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;

Keluaran

Diperbarui

Sejak menggabungkan string tidak berdokumen dan tidak dapat diandalkan . Itu tidak selalu bekerja seperti yang diharapkan . Jadi Anda harus menyelesaikan dengan 2 solusi di bawah ini

  1. Gunakan STRING_AGG (Dari SQL Server 2017 dan yang lebih baru)
SELECT STRING_AGG(QUOTENAME(Col), ', ')
from (SELECT DISTINCT Col FROM #b) A
// Output: [1], [2], [3]
  1. Gunakan Ekstensi 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],

Terima kasih komentar @GarethD. Lihat di db<>biola



  1. DBeaver
  2.   
  3. phpMyAdmin
  4.   
  5. Navicat
  6.   
  7. SSMS
  8.   
  9. MySQL Workbench
  10.   
  11. SQLyog
  1. Tidak dapat mengimpor/menyebarkan database ke SQL Azure:Tujuan layanan (Bisnis/Web) yang ditentukan tidak valid.

  2. Perintah SQL Tambahkan Diagram Basis Data

  3. SQL SERVER MANAGEMENT STUDIO:Sorot variabel

  4. Cegah baris yang terpengaruh entri dalam ekspor file dari SSMS

  5. Ubah jumlah varchar yang dipisahkan koma yang tidak diketahui dalam 1 kolom menjadi beberapa kolom