Преобразование сводной таблицы доступа в SQL Server - PullRequest
1 голос
/ 10 июля 2011

У меня проблемы с преобразованием сводной таблицы MS Access в SQL Server. Я надеялся, что кто-то может помочь ..

TRANSFORM First(contacts.value) AS FirstOfvalue
SELECT contacts.contactid
FROM contacts RIGHT JOIN contactrecord ON contacts.[detailid] = contactrecord.[detailid]
GROUP BY contacts.contactid
PIVOT contactrecord.wellknownname
;

Редактировать: Отвечая на некоторые комментарии

Таблица контактов имеет три поля

contactid | detailid | value  |
1             1          Scott

contactrecord имеет что-то вроде

detailid  | wellknownname
1         |  FirstName
2         |  Address1 
3         |  foobar

contractrecord является dyanamic в том смысле, что пользователь в любое время может создать поле для добавления в контакты

запрос на доступ извлекается

contactid  | FirstName | Address1 | foobar
1          | Scott     |   null   |  null

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

Что касается преобразования ... это встроенная функция доступа. Подробнее об этом можно узнать здесь . First () просто получит первый результат в соответствующей строке.

Я надеюсь, что это помогает, и ценю всю помощь.

1 Ответ

2 голосов
/ 10 июля 2011

При быстром поиске динамических сводных таблиц появляется эта статья .

После переименования вещей в его последнем запросе на странице я придумал следующее:

DECLARE @PivotColumnHeaders VARCHAR(max);
SELECT @PivotColumnHeaders = COALESCE(@PivotColumnHeaders + ',['+ CAST(wellknownname as varchar) + ']','['+ CAST(wellknownname as varchar) + ']')
FROM contactrecord;

DECLARE @PivotTableSQL NVARCHAR(max);

SET @PivotTableSQL = N'
    SELECT *
    FROM (
        SELECT 
            c.contactid,
            cr.wellknownname,
            c.value
        FROM contacts c
        RIGHT JOIN contactrecord cr
        on c.detailid = cr.detailid
    ) as pivotData
    pivot(
        min(value)
        for wellknownname in (' + @PivotColumnHeaders +')
    ) as pivotTable
'
;

execute(@PivotTableSQL);

, которая, несмотря на свое уродство, выполняет свою работу

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...