Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/83.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
T-SQL反向透视字符串的每个字符_Sql_Sql Server_Sql Server 2005_Tsql - Fatal编程技术网

T-SQL反向透视字符串的每个字符

T-SQL反向透视字符串的每个字符,sql,sql-server,sql-server-2005,tsql,Sql,Sql Server,Sql Server 2005,Tsql,我们在sql server 2005数据库中有一个如下表: event_id staff_id weeks 1 1 NNNYYYYNNYYY 1 2 YYYNNNYYYNNN 2 1 YYYYYYYYNYYY 这是一个时间表软件,基本上是说哪些工作人员被分配到一个活动登记册,以及他们在该登记册上教授的周数。因此,staff_id 1并没有教授事件1的前3周,而是教授以下4周 是

我们在sql server 2005数据库中有一个如下表:

event_id   staff_id   weeks

1          1          NNNYYYYNNYYY
1          2          YYYNNNYYYNNN
2          1          YYYYYYYYNYYY
这是一个时间表软件,基本上是说哪些工作人员被分配到一个活动登记册,以及他们在该登记册上教授的周数。因此,staff_id 1并没有教授事件1的前3周,而是教授以下4周

是否有简单的方法将其转换为更简单的形式,例如:

event_id   staff_id   week
1          1          4
1          1          5
1          1          6
1          1          7
1          1          10
1          1          11
1          1          12
1          2          1
1          2          2
1          2          3
1          2          7
1          2          8
1          2          9
2          1          1
2          1          2
2          1          3
2          1          4
2          1          5
2          1          6
2          1          7
2          1          8
2          1          10
2          1          11
2          1          12

week列是否总是有12个字符,或者可以是任意长度?如果这是一次性数据传输,并且速度不是问题,则可以使用光标。如果您动态地需要它,我建议您在应用程序代码中而不是在db中这样做@LukeH我缩短了它实际上是53个星期,一年中四舍五入,但是固定长度
WITH cte AS
(
    SELECT 1 AS [week]
    UNION ALL
    SELECT [week] + 1
    FROM cte
    WHERE [week] < 53
)
SELECT t.event_id, t.staff_id, cte.[week]
FROM your_table AS t
    INNER JOIN cte
        ON LEN(ISNULL(t.weeks, '')) >= cte.[week]
            AND SUBSTRING(t.weeks, cte.[week], 1) = 'Y'
ORDER BY t.event_id, t.staff_id, cte.[week]