T-SQL反向透视字符串的每个字符
我们在sql server 2005数据库中有一个如下表: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周 是
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]