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

Połącz tabele rzędami

Jeśli masz tylko kilka numerów pozycji, możesz to zrobić za pomocą PIVOT słowo kluczowe

select
    UserID,
    UserName,
    [1] as Position1,
    [2] as Position2,
    [3] as Position3
from
(
    select
        U.UserID, U.UserName, P.PositionName,
        row_number() over (partition by U.UserID order by P.PositionName) as RowNum
    from Positions_Users as PU
        inner join Positions as P on P.PositionID = PU.PositionID
        inner join Users as U on U.UserID = PU.UserID
) as P
    pivot
    (
        min(P.PositionName)
        for P.RowNum in ([1], [2], [3])
    ) as PIV

SQL FIDDLE

Jeśli jednak chcesz mieć dynamiczną liczbę kolumn, musisz użyć dynamicznego SQL, w ten sposób

declare @stmt nvarchar(max), @stmt_columns1 nvarchar(max), @stmt_columns2 nvarchar(max)
declare @Temp_Data table (RowNum nvarchar(max))

insert into @Temp_Data
select distinct row_number() over (partition by U.UserID order by P.PositionName) as RowNum
from Positions_Users as PU
    inner join Positions as P on P.PositionID = PU.PositionID
    inner join Users as U on U.UserID = PU.UserID

select @stmt_columns1 = stuff((select ', [' + RowNum + ']' from @Temp_Data for xml path(''), type).value('.', 'nvarchar(max)'), 1, 2, '')
select @stmt_columns2 = stuff((select ', [' + RowNum + '] as Position' + RowNum from @Temp_Data for xml path(''), type).value('.', 'nvarchar(max)'), 1, 2, '')

select @stmt = '
select
    UserID,
    UserName,' + @stmt_columns2 + '
from
(
    select
        U.UserID, U.UserName, P.PositionName,
        row_number() over (partition by U.UserID order by P.PositionName) as RowNum
    from Positions_Users as PU
        inner join Positions as P on P.PositionID = PU.PositionID
        inner join Users as U on U.UserID = PU.UserID
) as P
    pivot
    (
        min(P.PositionName)
        for P.RowNum in (' + @stmt_columns1 + ')
    ) as PIV'

exec sp_executesql @stmt = @stmt

Skrzydełka SQL




  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Kolumna tekstowa nie przechowująca więcej niż 8000 znaków

  2. Zgodność z SQL Server 2008 + PCI? Dotyczy PCI, a także kluczy symetrycznych!

  3. Jak zbudować instrukcję SQL z wykorzystaniem identyfikatorów, które mogą nie być dostępne w tabeli?

  4. SQL DELETE z INNER JOIN

  5. Wybieranie z tabeli, w której nazwa jest przekazywana jako zmienna