2011-07-09 43 views
1

我無法將MS Access數據透視錶轉換爲SQL Server。希望有人可以幫助..將訪問數據透視錶轉換爲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因爲用戶在任何時候都可以創建一個字段添加到聯繫人

接入查詢翻出

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

這是對wellknownname樞軸。這裏的關鍵是列數是動態的,因爲用戶可以隨時爲聯繫人創建另一個字段。作爲新的樞軸表完全一樣,我想知道如何在sql server中重新創建這個訪問查詢。

至於變換...這是一個內置的訪問函數。有關它的更多信息here。 First()將只取得該匹配行的第一個結果。

我希望這有助於並感謝所有的幫助。

+0

更容易幫助。如果我們看到你的數據和你期望的輸出,它也會有幫助 –

+0

@ t-clausen.dk:從我在這裏學到的東西看來,'TRANSFORM'就是*標準命令(在MS Access中) ,並將其刪除,或者將其替換爲相應的T-SQL構造,這個問題就是這個問題。但我同意你們的例子,他們會幫助很大。 –

+0

@Scott:並不是所有人都可以很好地瞭解MS Access *和* T-SQL,可以幫助您。 @ t-clausen.dk是正確的:發佈樣本數據和輸出結果對於我們瞭解T-SQL的人來說確實能夠幫助我們建議一個好的解決方案。 –

回答

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

但它的醜陋,但如果更換轉化爲一些標準的命令,它會做工作

+0

@ t-clausen.dk我不擔心從事物的sql方面進行排序。一切都推到一些.NET代碼。然而,接下來的挑戰是將其納入觀點。 – Scott