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

Transponer rækker og kolonner uden aggregat

Hvis du vil anvende PIVOT funktion, skal du bruge en aggregeret funktion for at få resultatet, men du vil også bruge en vinduesfunktion såsom row_number() for at generere en unik sekvens for hver kontakt på kontoen.

Først vil du forespørge om dine data svarende til:

select account, contact,
  'contact'
    + cast(row_number() over(partition by account
                              order by contact) as varchar(10)) seq
from yourtable
 

Se SQL Fiddle with Demo. Dette vil oprette en ny kolonne med den unikke sekvens:

| ACCOUNT | CONTACT | SEQ | |---------|-----------|----------| | 1 | 324324324 | contact1 | | 1 | 674323234 | contact2 |

Hvis du har et begrænset antal kolonner, kan du hårdkode din forespørgsel:

select account,
  contact1, contact2, contact3, contact4
from 
(
  select account, contact,
    'contact'
      + cast(row_number() over(partition by account
                                order by contact) as varchar(10)) seq
  from yourtable
) d
pivot
(
  max(contact)
  for seq in (contact1, contact2, contact3, contact4)
) piv;
 

Se SQL Fiddle with Demo

Hvis du har et ukendt antal kolonner, skal du bruge dynamisk SQL:

DECLARE @cols AS NVARCHAR(MAX),
    @query  AS NVARCHAR(MAX)

select @cols = STUFF((SELECT ',' + QUOTENAME(seq) 
                    from
                    (
                      select 'contact'
                              + cast(row_number() over(partition by account
                                                        order by contact) as varchar(10)) seq
                      from yourtable
                    ) d
                    group by seq
                    order by seq
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT account, ' + @cols + ' 
            from 
            (
                select account, contact,
                  ''contact''
                    + cast(row_number() over(partition by account
                                              order by contact) as varchar(10)) seq
                from yourtable
            ) x
            pivot 
            (
                max(contact)
                for seq in (' + @cols + ')
            ) p '

execute sp_executesql @query;
 

Se SQL Fiddle with Demo. Begge vil give dig et resultat af:

| ACCOUNT | CONTACT1 | CONTACT2 | CONTACT3 | CONTACT4 | |---------|-----------|-----------|-----------|-----------| | 1 | 324324324 | 674323234 | (null) | (null) | | 2 | 433243443 | 833343432 | (null) | (null) | | 3 | 787655455 | (null) | (null) | (null) | | 4 | 455435435 | 754327545 | (null) | (null) | | 5 | 432432432 | 432433242 | 432455553 | 543544355 |

  1. Skift prioritet for en konto i en database-mailprofil (SSMS)

  2. SQL:IF-sætning i WHERE-sætning

  3. Omarranger tabelkolonner i Oracle

  4. Sådan formateres tal som valuta i MySQL