我目前有数据存储与命名期间相关的周数,如下表所示,其中包含PERIOD和DATESTRING列
PERIOD DATESTRING
Period1 NNYNYY //The position of 'Y' indicates a yes, 'N' indicates no
Period2 NNNNNY
...
因此,由于第3周是第1期的一部分,因此该期间的日期字符串中的第3位有一个“Y”。
我需要将其转换为一个表格,该表格中包含一个句点,以及Ys在下一个列中的位置:
PERIOD WEEKNUMBER
Period1 3
Period1 5
Period1 6
Period2 6
...
答案 0 :(得分:1)
您可以通过加入数字表并使用substring()
函数在每个位置获取字符来执行此操作:
with numbers as (
select 1 as num
union all
select num + 1 from numbers
where num < 53
)
select period,num from table1
join numbers on substring(datestring,num,1) = 'Y';
这使用递归查询来构建数字表。
我在SQL Server 2008上构建并测试了它,但我认为在2005年这样做不应该是一个问题。你最多必须调整它。
答案 1 :(得分:1)
使用Recursive CTE charindex
查找Y
(DEMO)的{{3}}是另一种方法:
with cte as (
select period, charindex('Y', datestring) as weeknumber
from Periods
where charindex('Y', datestring) <> 0
union all
select p.period, charindex('Y', p.datestring, cte.weeknumber + 1) as weeknumber
from periods p
join cte on p.period = cte.period
where charindex('Y', p.datestring, cte.weeknumber + 1) <> 0
)
select * from cte
order by period, weeknumber
答案 2 :(得分:0)
这是你的一些想法。这是Oracle查询,但我认为它应该适用于任何SQL,或者您可以修复它以在SQL Srv 2005中工作。所有使用的函数都是ANSI SQL标准。我不确定2005年是否有LEVEL这样的东西......:
SELECT 'Period1'||' '||Y_Pos as Y_Pos FROM
(
SELECT distinct(Instr('NNYNYY', 'Y', LEVEL)) Y_Pos
FROM dual
CONNECT BY LEVEL <= Length('NNYNYY')
ORDER BY 1
)
/
SQL>
Y_POS
----------
Period1 3
Period1 5
Period1 6
答案 3 :(得分:0)
master..spt_values系统表的另一个选项
SELECT PERIOD, number
FROM dbo.test29 t
JOIN master..spt_values v ON v.type = 'P'
AND SUBSTRING(DATESTRING, number, 1) = 'Y'