现在在你对这个问题发疯并开始批评这种思维方式之前,让我告诉你我同意你的观点,这个完全不正常的数据库设计让我感到厌恶,就像下一个人一样,我们必须使用它所以,让我们来看看。
有一个数据库,有12列,一年中每个月一个(我知道,我知道..),实际上有24列,当你计算那些列出了什么内容以及什么出来的时候。
它们被标记为Month1,Month2等。正如您所期望的那样......
我试图找到一种方法来系统地选择基于a的列,等待它,是的!月值,1月1,等等。
到目前为止,这还没有奏效:
SELECT Month+1 ...
或者这个:
SELECT Month+@myMonth
因此,虽然我的第一个选择是建立一个好的数据库,但我没有办法,即使我做了,我也不会被允许。
那么有没有办法解决这个问题?无需创建24个案例长的Select Case?
答案 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。