Разделите один столбец на несколько - SQL - PullRequest
1 голос
/ 14 октября 2011

У меня есть столбец @months, в котором хранятся месяцы в этом формате

@ month = '01 -03-05-11-12 '

Я хотел бы иметь запрос SELECT, который делит этот столбец на 12, делая его январь, февраль, март

Каждая из моих записей имеет этот столбец впереди.Таким образом, если запись содержит @month = '01 -03 ', она отображается в январе и марте.Можно ли что-то подобное сделать?Или что-то близкое - это достаточно хорошо.

Я играл с делом, но не мог дать результаты.


Код, если кто-то хочет попробовать

create table recs(
id int not null primary key,
cust_name varchar(20),
callmonth varchar(36)
)

insert into recs values(1,'john','01-12')
insert into recs values(2,'Jessica','02-06')
insert into recs values(3,'Charlie','01-06')
insert into recs values(4,'steale','03-04')
insert into recs values(5,'Silica','01-02-03-04-05-06-07-08-09-10-11-12')
insert into recs values(6,'Luder','01-03-05-07-09-11-12')
insert into recs values(7,'Panther','01-06-12')
insert into recs values(8,'Dinky','03-04-15')

Ответы [ 4 ]

1 голос
/ 14 октября 2011

Мне может быть неясно, что вы пытаетесь сделать, но вы можете разделить на 12 таблиц, используя следующее:

INSERT INTO January_table
SELECT *
FROM Original_table
WHERE month LIKE '%01%';

Делайте это для каждого месяца, и это должно дать вам 12 таблиц, содержащих толькозначения, которые имеют этот месяц.Затем вы можете использовать представление для их объединения.

В качестве альтернативы, если вы ищете один запрос, вы можете использовать оператор case, подобный приведенному ниже:

INSERT INTO table
SELECT *
    CASE
    WHEN month LIKE '%01%' THEN 'True'
    ELSE 'False'
    END,
    CASE
    WHEN month LIKE '%02%' THEN 'True'
    ...
FROM Original_table;

Thisвыдаст таблицу со всеми полями из исходной таблицы, за которой следуют 12 «месячных столбцов», каждый из которых имеет значение «истина» или «ложь», представляющие, присутствует ли этот месяц в этой строке.

0 голосов
/ 14 октября 2011

Создайте функцию SPLIT и используйте ее с DATENAME, как показано ниже, вы можете получить список месяцев в строковом формате. Я думаю, что это решит часть вашей проблемы.

select  DATENAME(month, DATEADD(month, convert(int, val) , -1 )) AS month_str 
from  SPLIT('01-03-05-11-12', '-')

Результат будет (проверен вmssql сервер; он работает)

January
March
May
November
December

UDF

CREATE FUNCTION SPLIT
(
 @s nvarchar(max),
 @splitChar nchar(1)
)
returns @t table (id int identity(1,1), val nvarchar(max))
as
begin

declare @i int, @j int
select @i = 0, @j = (len(@s) - len(replace(@s,@splitChar,'')))

;with cte 
as
(
 select
  i = @i + 1,
  s = @s, 
  n = substring(@s, 0, charindex(@splitChar, @s)),
  m = substring(@s, charindex(@splitChar, @s)+1, len(@s) - charindex(@splitChar, @s))

 union all

 select 
  i = cte.i + 1,
  s = cte.m, 
  n = substring(cte.m, 0, charindex(@splitChar, cte.m)),
  m = substring(
   cte.m,
   charindex(@splitChar, cte.m) + 1,
   len(cte.m)-charindex(@splitChar, cte.m)
 )
 from cte
 where i <= @j
)
insert into @t (val)
select pieces
from 
(
 select 
 ltrim(rtrim(case when i <= @j then n else m end)) pieces
 from cte
) t
where
 len(pieces) > 0
option (maxrecursion 0)

return

end

GO
0 голосов
/ 14 октября 2011

Я согласен с другими постерами - вы должны изменить дизайн стола - если он у вас очень плохой.

ваше дело должно обычно иметь следующую форму:

case when instr(month,'01') > 0 then 'Jan'
0 голосов
/ 14 октября 2011

вы должны разделить значения на '-' - и тогда у вас будет таблица

и затем вы должны увидеть, находится ли это значение внутри этой таблицы + ее строковое имя.

приписка

Вы должны иметь такой стол:

01 - jan
02 - feb
...
...

скажем так: столовые месяцы ( TBLMNTH ) будут иметь ( id , name )

например. :

1 |   jan  
2 |   feb
select name from  TBLMNTH where @month CHARINDEX(name , @month)>-1
...