2013-12-12 54 views
0

現在,在您對這個問題發瘋並開始批評這種思維方式之前,讓我告訴您,我同意您的觀點,這種完全不規範的數據庫設計讓我感到厭惡然而,下一個人,我們必須和它一起工作,讓我們開始吧。如何在SQL Server中連接Select語句的列名稱

有一個數據庫,有12列,每年的一個月(我知道,我知道..),實際上是24列,當你計算那些說明什麼進入和什麼出去。

它們分別標記爲MONTH1,MONTH2等。正如你所期望..

我試圖找到一種方法來系統地選擇根據一列,等待它的,是的!月值,所以1代表一月,等等。

到目前爲止,這沒有奏效:

SELECT Month+1 ... 

或者這樣:

SELECT [email protected] 

所以,當我的第一選擇是到過建立一個好的數據庫,我沒有辦法,即使我做了我也不會被允許。

那麼有沒有辦法來解決這個問題?無需創建長達24箱的Select Case?

回答

1

您可以創建一個表值函數:

CREATE FUNCTION GetByMonth 
(
    @month int 
) 
RETURNS TABLE 
AS RETURN 
(
    SELECT CASE @month 
     WHEN 1 THEN Month1 
     WHEN 2 THEN Month2 
     --... 
    END AS MonthData 
    FROM Table1 
) 

,你可以從以後不必總是寫出來的話,那麼選擇:

SELECT MonthData 
FROM GetByMonth(2) AS m 

或者,

SELECT a.Month, m.MonthData 
FROM Table2 a 
CROSS APPLY GetByMonth(a.Month) m 
+0

你是有道理的,我很害怕我最終必須要這樣做。我認爲應該在SQL Server中實現這樣簡單的事情。雖然我確定有沒有非常有效的理由。 – user1676874

+1

你也可以使用動態SQL,但如果這樣做的話,我建議這樣做,並且只使用動態SQL作爲最後的手段。 –

+0

使用動態SQL有問題嗎?不是說我要去,我只是很好奇。 – user1676874

0

一種方法是使用不透明 - 就像這樣:

declare @month int 
set @month=11 
select monthval 
from (select * from months) p 
unpivot 
(monthval for monthnum in 
(month1,month2,month3,month4,month5,month6,month7,month8,month9,month10,month11,month12)) u 
where monthnum= 'month'+cast(@month as varchar(2)) 

SQLFiddle here