SQL SERVER - создайте таблицу, сопоставив строки и столбцы и указав Y или N - PullRequest
1 голос
/ 30 сентября 2011

В настоящее время у меня есть таблица со всеми данными, используя эти данные, я хочу создать другую таблицу, которую можно использовать для целей аудита (аналогичный макет, как сводная таблица)

Пример ниже:

Необработанные данные

Name         Places Visited
----------------------------
Will         London

John         Toronto

Dave         New York

Will         London

То, что я хочу (аналогично сводной таблице, но я могу использовать буквы):

Name/Places Visted    London      Toronto      New York

Will                    Y           N             Y

John                    N           Y             N

Dave                    N           N             Y

Любая помощь для создания этого будет очень признательна!

Надеюсь, я хорошо все объяснил, но дай мне знать, если ты хочешь что-то прояснить.

Большое спасибо !!

1 Ответ

3 голосов
/ 30 сентября 2011

Решение для 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, если у вас ограниченное количество городов .

...