2

我目前有数据存储与命名期间关联的周数,如下所示,在包含 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
...
4

4 回答 4

1

这是使用find (DEMO )使用递归 CTE执行此操作的另一种方法:charindexY

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
于 2013-01-24T15:01:35.560 回答
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 Fiddle中。

我在 SQL Server 2008 上构建并测试了它,但我认为在 2005 年这样做应该不是问题。您最多只能对其进行调整。

于 2013-01-24T14:52:19.813 回答
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'
于 2013-01-25T20:51:15.710 回答
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
于 2013-01-24T19:16:14.390 回答