Sqlserver
 sql >> Baza danych >  >> RDS >> Sqlserver

Pivot bez funkcji agregującej w MSSQL 2008 R2

Możesz użyć funkcji PIVOT, aby uzyskać wynik, wystarczy użyć row_number() pomóc.

Podstawowym zapytaniem do tego będzie:

select skill_id, skill, parameter,
  row_number() over(partition by skill, skill_id order by skill_id) rn
from yt;

Zobacz SQL Fiddle z wersją demonstracyjną . Używam row_number() zastosować odrębną wartość do każdego wiersza w ramach skill i skill_id , użyjesz tej wartości numeru wiersza jako kolumny do przestawienia.

Pełny kod z zastosowanym PIVOT będzie wyglądał następująco:

select skill_id, skill,[Parameter_1], [Parameter_2], [Parameter_3]
from 
(
  select skill_id, skill, parameter,
    'Parameter_'+cast(row_number() over(partition by skill, skill_id 
                                     order by skill_id) as varchar(10)) rn
  from yt
) d
pivot
(
  max(parameter)
  for rn in ([Parameter_1], [Parameter_2], [Parameter_3])
) piv;

Zobacz SQL Fiddle z wersją demonstracyjną .

W twoim przypadku wydaje się, że będziesz mieć nieznaną liczbę parametrów dla każdej umiejętności. Jeśli to prawda, będziesz chciał użyć dynamicznego SQL, aby uzyskać wynik:

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

select @cols = STUFF((SELECT distinct ',' + QUOTENAME('Parameter_'
                          +cast(row_number() over(partition by skill, skill_id 
                               order by skill_id) as varchar(10))) 
                    from yt
            FOR XML PATH(''), TYPE
            ).value('.', 'NVARCHAR(MAX)') 
        ,1,1,'')

set @query = 'SELECT skill_id, skill,' + @cols + ' from 
             (
                select skill_id, skill, parameter,
                  ''Parameter_''+cast(row_number() over(partition by skill, skill_id 
                                   order by skill_id) as varchar(10)) rn
                from yt
            ) x
            pivot 
            (
                max(parameter)
                for rn in (' + @cols + ')
            ) p '

execute(@query);

Zobacz SQL Fiddle z wersją demonstracyjną




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Nie można wykonać operacji, ponieważ dostawca OLE DB SQLNCLI10 dla serwera połączonego (null) nie mógł rozpocząć transakcji rozproszonej

  2. Muszę przekazać nazwy kolumn za pomocą zmiennej w instrukcji select w procedurze sklepu, ale nie mogę użyć dynamicznego zapytania

  3. Nie możesz użyć tymczasowej kolumny w klauzuli where?

  4. tożsamość z sql insert przez jdbctemplate

  5. Nie można przekazać parametrów wejściowych do procedury składowanej