В MySQL эта операция называется GROUP_CONCAT , но SQL Server ее не поддерживает.
В SQL Server вы можете симулировать те же функции, используя FOR XML PATH hack.
SELECT extern.EmployeeID, states AS USState
FROM Areas AS extern
CROSS APPLY (
SELECT USState + ' '
FROM Areas AS intern
WHERE extern.EmployeeID = intern.EmployeeID
FOR XML PATH('')
) T1 (states)
GROUP BY extern.EmployeeID, states
ORDER BY extern.EmployeeID
Альтернативой является использование рекурсивного CTE . Это менее удачное решение, но оно более сложное:
WITH qs(EmployeeID, USState, rn, cnt) AS
(
SELECT
EmployeeID,
USState,
ROW_NUMBER() OVER (PARTITION BY EmployeeID ORDER BY USState),
COUNT(*) OVER (PARTITION BY EmployeeID)
FROM Areas
),
t (EmployeeID, prodname, gc, rn, cnt) AS
(
SELECT EmployeeID, USState, CAST(USState AS NVARCHAR(MAX)), rn, cnt
FROM qs
WHERE rn = 1
UNION ALL
SELECT
qs.EmployeeID, qs.USState,
CAST(t.gc + ' ' + qs.USState AS NVARCHAR(MAX)),
qs.rn, qs.cnt
FROM t
JOIN qs ON qs.EmployeeID = t.EmployeeID
AND qs.rn = t.rn + 1
)
SELECT EmployeeID, gc AS USState
FROM t
WHERE rn = cnt
ORDER BY EmployeeID
OPTION (MAXRECURSION 0)
Оба метода дают желаемый результат:
EmployeeID USState
1 NY FL AR
2 DC AR
3 TX