如何在SQL Server中连接Select语句的列名

时间:2013-12-12 00:07:56

标签: sql-server sql-server-2008

现在在你对这个问题发疯并开始批评这种思维方式之前,让我告诉你我同意你的观点,这个完全不正常的数据库设计让我感到厌恶,就像下一个人一样,我们必须使用它所以,让我们来看看。

有一个数据库,有12列,一年中每个月一个(我知道,我知道..),实际上有24列,当你计算那些列出了什么内容以及什么出来的时候。

它们被标记为Month1,Month2等。正如您所期望的那样......

我试图找到一种方法来系统地选择基于a的列,等待它,是的!月值,1月1,等等。

到目前为止,这还没有奏效:

SELECT Month+1 ...

或者这个:

SELECT Month+@myMonth

因此,虽然我的第一个选择是建立一个好的数据库,但我没有办法,即使我做了,我也不会被允许。

那么有没有办法解决这个问题?无需创建24个案例长的Select Case?

2 个答案:

答案 0 :(得分: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
)

然后您可以从以后选择而不必总是写出CASE:

SELECT MonthData
FROM GetByMonth(2) AS m

或者,

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

答案 1 :(得分:0)

一种方法是使用unpivot - 就像这样:

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