SQL SERVER - создайте таблицу, сопоставив строки и столбцы и поставив Y или N

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

Пример ниже:

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

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

Любая помощь в производстве этого будет высоко оценена!

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

Огромное спасибо!!


person K-M    schedule 30.09.2011    source источник
comment
Почему закрытое голосование? Вопрос кажется мне очень ясным. Ему нужен SQL-запрос, который считывает данные из таблицы, содержащей необработанные данные, и дает желаемый результат.   -  person Mark Byers    schedule 30.09.2011
comment
@Mo.: Может быть, взгляните на PIVOT (предполагается, что SQL Server 2005 или новее): msdn.microsoft.com/en-us/library/ms177410.aspx   -  person Mark Byers    schedule 30.09.2011
comment
Я пробовал это в Excel, но не мог придумать, как это сделать в SQL, я совсем новичок в SQL. Использование PIVOT позволит мне использовать мои собственные буквы, например. Д ИЛИ Н? благодарю вас!!   -  person K-M    schedule 30.09.2011


Ответы (1)


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

person Bogdan Sahlean    schedule 30.09.2011
comment
Большое спасибо! мне придется вводить имена и местоположение по отдельности - у меня есть таблица с примерно 200 записями? благодарю вас - person K-M; 30.09.2011
comment
Неважно, сколько у вас записей. Важно количество РАЗЛИЧНЫХ мест/городов. - person Bogdan Sahlean; 30.09.2011
comment
С неизвестным количеством городов вы можете использовать динамические предложения SQL: msdn.microsoft.com/ en-us/library/ms188001.aspx - person DavidEG; 30.09.2011
comment
Здесь я представил решение для переменного числа столбцов (столбцы, полученные в результате операции PIVOT). - person Bogdan Sahlean; 30.09.2011
comment
Вы должны использовать COUNT агрегатную функцию: SELECT pvt.* FROM @Temp src PIVOT( COUNT(src.Place) FOR src.Place IN([London], [Toronto], [New York]) ) pvt ORDER BY pvt.Name DESC - person Bogdan Sahlean; 30.09.2011