将Access数据透视表转换为SQL Server

时间:2011-07-09 21:49:12

标签: tsql ms-access

我在将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

这是wellknownname上的数据透视表。这里的关键是列数是动态的,因为用户可以随时为联系人创建另一个字段。完全是数据透视表的新手,我想知道如何在sql server中重新创建这个访问查询。

至于转换...这是一个内置的访问功能。有关它的更多信息here。 First()将在该匹配行上获取第一个结果。

我希望这有助于并感谢所有帮助。

1 个答案:

答案 0 :(得分:2)

我快速搜索动态数据透视表,提出this article

在页面上的最后一个查询中重命名后,我想出了这个:

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);

尽管它很丑陋,但却能胜任