这个操作在MySQL中被称为GROUP_CONCAT,但SQL Server不支持它。
在SQL Server中,您可以使用FOR XML PATH黑客模拟相同的功能。
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
另一种方法是使用recursive 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
另请参阅:http://stackoverflow.com/questions/451415/simulating-group-concat-mysql-function-in-ms-sql-server-2005 – 2010-08-08 10:54:36