Решение для SQL Server 2005/2008:
DECLARE @Temp TABLE
(
Name NVARCHAR(100) NOT NULL
,Place NVARCHAR(100) NOT NULL
);
INSERT @Temp
SELECT 'Will','London'
UNION ALL
SELECT 'John','Toronto'
UNION ALL
SELECT 'Dave','New York'
UNION ALL
SELECT 'Will','London';
SELECT
pvt.Name [Name/Places Visted]
,CASE WHEN [London] IS NOT NULL THEN 'Y' ELSE 'N' END [London]
,CASE WHEN [Toronto] IS NOT NULL THEN 'Y' ELSE 'N' END [Toronto]
,CASE WHEN [New York] IS NOT NULL THEN 'Y' ELSE 'N' END [New York]
FROM @Temp src
PIVOT( MAX(src.Place) FOR src.Place IN([London], [Toronto], [New York]) ) pvt
ORDER BY pvt.Name DESC;
Результаты:
Name/Places Visted London Toronto New York
------------------- ------ ------- --------
Will Y N N
John N Y N
Dave N N Y
Примечание. Столбцы, полученные в результате операции PIVOT
, являются статическими. Это означает, что если вы добавляете записи с Place='PARIS'
, вы должны изменить запрос следующим образом: PIVOT( MAX(src.Place) FOR src.Place IN([London], [Toronto], [New York], [Paris])
. Так, вы можете использовать оператор PIVOT
, если у вас ограниченное количество городов .