sql >> Databáze >  >> RDS >> Sqlserver

seskupování a přepínání sloupců a řádků

Můžete to udělat pomocí dynamického PIVOT a ROW_NUMBER() funkce:

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 – odlišný seznam, konkrétní pořadí

Upravit:Pokud nechcete, aby byl seznam odlišný, odstraňte první výše uvedenou položku a pokud chcete zachovat libovolné řazení, změňte ORDER BY na (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 – úplný seznam, libovolné pořadí

A konečně, pokud jste nechtěli RowRank pole ve výsledcích, stačí znovu použít @cols proměnná ve vašem 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. 5 bezproblémových tipů pro použití příkazu SQL UPDATE s JOIN

  2. Jak vytvořit databázi pomocí Liquibase

  3. První přihlášení:HTTP Status 500 – Zpracování požadavku se nezdařilo; vnořená výjimka je org.springframework.transaction.CannotCreateTransactionException

  4. Kdy použít rady v dotazu Oracle