Sqlserver
 sql >> база данни >  >> RDS >> Sqlserver

групиране и превключване на колони и редове

Можете да направите това с динамичен PIVOT и ROW_NUMBER() функция:

DECLARE @cols AS VARCHAR(1000),
        @query  AS VARCHAR(8000)
SELECT @cols = STUFF((SELECT ',' +   QUOTENAME(Name) 
                    FROM (SELECT DISTINCT Name
                          FROM #test
                          )sub
                    ORDER BY Name
                    FOR XML PATH(''), TYPE).value('.', 'VARCHAR(MAX)') 
                    ,1,1,'')
PRINT @cols

SET @query = '
WITH cte AS (SELECT DISTINCT *
             FROM  #test)
    ,cte2 AS (SELECT *,ROW_NUMBER() OVER(PARTITION BY Name ORDER BY Apt)RowRank
             FROM  cte)
SELECT * 
FROM  cte2 
PIVOT (max(Apt) for Name in ('[email protected]+')) p
            '
EXEC (@query)

SQL Fiddle – отделен списък, специфичен ред

Редактиране:Ако не искате списъкът да е различен, елиминирайте първия cte по-горе и ако искате да запазите произволно подреждане, променете ORDER BY към (SELECT 1) :

DECLARE @cols AS VARCHAR(1000),
        @query  AS VARCHAR(8000)
SELECT @cols = STUFF((SELECT ',' +   QUOTENAME(Name) 
                    FROM (SELECT DISTINCT Name
                          FROM #test
                          )sub
                          ORDER BY Name
                    FOR XML PATH(''), TYPE).value('.', 'VARCHAR(MAX)') 
                    ,1,1,'')
PRINT @cols

SET @query = '
WITH cte AS (SELECT *,ROW_NUMBER() OVER(PARTITION BY Name ORDER BY (SELECT 1))RowRank
             FROM  #test)
SELECT * 
FROM  cte 
PIVOT (max(Apt) for Name in ('[email protected]+')) p
            '
EXEC (@query)

SQL Fiddle - пълен списък, произволен ред

И накрая, ако не искате RowRank полето в резултатите си, просто използвайте повторно @cols променлива във вашия SELECT :

SET @query = '
WITH cte AS (SELECT *,ROW_NUMBER() OVER(PARTITION BY Name ORDER BY (SELECT 1))RowRank
             FROM  #test)
SELECT '[email protected]+' 
FROM  cte 
PIVOT (max(Apt) for Name in ('[email protected]+')) p
            '
EXEC (@query)


  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. условие if в заявка за актуализиране на sql сървър

  2. Вътрешни елементи на седемте сорта SQL сървъри – част 1

  3. Как да променя езика по подразбиране за SQL Server?

  4. SQL MERGE израз за актуализиране на данни

  5. Пуснете първичния ключ с помощта на скрипт в базата данни на SQL Server