我有一个名为@months的专栏,以这种格式存储数月
@month = '01 -03-05-11-12'
我想有一个SELECT查询将此列划分为12,使其成为1月,2月,3月
我的每一条记录都在前面。因此,如果记录中包含@month = '01 -03',则显示在1月和3月。可以这样做吗?或者任何接近的东西都足够好。
我使用了case语句,但无法生成结果。
代码,如果有人想尝试
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')
答案 0 :(得分:1)
我可能不清楚你要做什么,但你可以使用以下内容分成12个表:
INSERT INTO January_table
SELECT *
FROM Original_table
WHERE month LIKE '%01%';
每个月执行此操作,它应该为您提供12个表,其中仅包含该月的值。然后,您可以使用视图来组合它们。
或者,如果您正在寻找一个查询,您可以使用如下所示的案例陈述:
INSERT INTO table
SELECT *
CASE
WHEN month LIKE '%01%' THEN 'True'
ELSE 'False'
END,
CASE
WHEN month LIKE '%02%' THEN 'True'
...
FROM Original_table;
这将生成一个表格,其中包含原始表格中的所有字段,后跟12个“每月列”,每个列都有一个真或假,表示该行中是否存在该月份。
答案 1 :(得分:0)
你应该用' - '分割值,然后你就会有一个表
然后你应该看看这个值是否在这个表中+它的字符串名称。
P.S。
你必须有这样一个表:
01 - jan
02 - feb
...
...
让我们说:
表月( TBLMNTH )将有( id , name )
e.g。 :
1 | jan
2 | feb
select name from TBLMNTH where @month CHARINDEX(name , @month)>-1
答案 2 :(得分:0)
我同意其他海报 - 你应该改变你的桌面设计 - 如果你拥有它的形式非常糟糕。
您的个案陈述通常应采用以下形式:
case when instr(month,'01') > 0 then 'Jan'
答案 3 :(得分:0)
创建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