2

現在、PERIOD列とDATESTRING列のテーブルに、次のように名前付き期間に関連付けられた週番号を格納するデータがあります。

PERIOD  DATESTRING
Period1 NNYNYY    //The position of 'Y' indicates a yes, 'N' indicates no
Period2 NNNNNY
...

したがって、第3週は期間1の一部であるため、その期間の日付文字列の位置3に「Y」があります。

これを、1つの列にピリオドがあり、次の列にYの位置があるテーブルに変換する必要があります。

PERIOD  WEEKNUMBER
Period1 3
Period1 5
Period1 6
Period2 6
...
4

4 に答える 4

1

を検索するために使用する再帰CTEでそれを行う別の方法は次のとおりです(DEMO):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';

これは、再帰クエリを使用して数値のテーブルを作成します。

これはSQLFiddleにあります

SQL Server 2008でビルドしてテストしましたが、2005年にこれを行うのは問題ないと思います。せいぜい微調整する必要があります。

于 2013-01-24T14:52:19.813 に答える
0

master..spt_values システム テーブルのもう 1 つのオプション

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 に答える