2013-12-12 3 views
0

Теперь, прежде чем вы сходите с ума от этого вопроса и начинаете критиковать этот способ мышления, позвольте мне сказать вам, что я согласен с вами, этот полностью ненормализованный дизайн базы данных отвращает меня так же, как и Следующий человек, однако, должен работать с ним, поэтому давайте доберемся до него.Как связать имя столбца для оператора Select в SQL Server

Существует база данных, состоящая из 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.

Смежные вопросы