2010-01-31 32 views
11

我有一個表,看起來像這樣:SQL Server可以在不知道結果列名的情況下轉軸嗎?

Month  Site   Val 
2009-12 Microsoft  10 
2009-11 Microsoft  12 
2009-10 Microsoft  13 
2009-12 Google   20 
2009-11 Google   21 
2009-10 Google   22 

而且我希望得到一個2維表,讓我的「瓦爾」爲每個站點的一個月,如:

Month  Microsoft  Google 
2009-12  10   20 
2009-11  12   21 
2009-10  13   22 

但可以肯定的是,我不知道可以在「網站」中找到的所有可能的值。如果出現新網站,我想自動在我的結果表中獲得一個新列。

我看到的所有代碼示例都可以這樣做,這要求我在查詢文本中對「Microsoft和Google」進行硬編碼。
I saw one that didn't,但它基本上是通過列出網站並生成一個查詢(連續字符串)並在其中包含這些列名來僞造它。

是不是有辦法讓SQL Server 2008做到這一點,而不是像這樣的黑客?

注:我需要能夠運行此查詢,我從ASP.Net發送,我不能做存儲過程或其他類似的東西。

謝謝!
Daniel

+0

什麼你正在尋找應該可能通過執行查詢在運行時使用'exec(@sql)'見[這裏](http://stackoverflow.com/questions/15752112/)。 – surfmuggle 2016-03-27 04:56:03

回答

6

鏈接到的示例使用動態SQL。不幸的是,當事先不知道輸出列時,沒有其他內置的方法可以在SQL Server中進行擺動。

如果數據不是很大,最簡單的方法是從ASP.NET運行普通的行查詢並在應用程序代碼中執行您的透視。如果數據非常大,那麼在首次查詢可能的列值後,您必須動態生成SQL。

請注意,您實際上不需要編寫生成動態SQL的SQL語句;你可以簡單地在ASP.NET中生成SQL,這很可能會更容易。在將它們夾在生成的查詢中之前,請不要忘記跳過不同的Site值,並且不要忘記參數化SQL語句的任何部分,而通常情況下,這些部分不需要透視。

-1

選擇一個月, 分鐘(情況下的網站時, 'microsoft'then VAL端)微軟, 分鐘(當殼體站點' google'then VAL端)按月來自Google withoutpivot 組

select main.month, 
m.val as microsoft, 
g.val as google 
from withoutpivot main 
inner join withoutpivot m on m.month=main.month 
inner join withoutpivot g on g.month=main.month 
where m.site='microsoft' 
and g.site='google' 
相關問題