sql >> Database teknologi >  >> RDS >> Sqlserver

gruppering og skift af kolonner og rækker

Du kan gøre dette med dynamisk PIVOT og ROW_NUMBER() funktion:

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 - Distinct List, Specific Order

Rediger:Hvis du ikke ønsker, at listen skal være særskilt, skal du fjerne den første cte ovenfor, og hvis du vil fortsætte med vilkårlig rækkefølge, skal du ændre ORDER BY til (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 - Fuld liste, vilkårlig rækkefølge

Og endelig, hvis du ikke ville have RowRank feltet i dine resultater, skal du blot genbruge @cols variabel i din 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. hvordan man ændrer standard datoformat, når man opretter tabel i MYSQL

  2. Får fejl:Kan ikke oprette forbindelse til MySQL-serveren på 'SERVER_IP' (99)

  3. biginteger array-funktioner

  4. hvordan man opdaterer mysql med php, når man trækker fra