我正在编写一个脚本来创建一个.csv
,以注册用户参加VLE课程。通常,每个用户都有一个VLE课程,但有些用户有多个VLE课程要注册。当一个用户要求某个程序同时将其注册到多个课程时,我需要我的脚本来创建多个结果行。
我研究了使用变量的while循环,但是无法理解所需的逻辑。
表
ID AOS Session Year
------------------------------
741258 BATP CC2 2
456789 BATP TS1 1
963741 BATP SM3 3
456123 BATP PM2 2
687459 MACP CP1 1
753951 MAAS AS1 1
查询:
select
'ENROLL' as [Type],
bio.student_id as [ID],
'Student' as [Role],
case
--Course offering
when AOS = 'batp' and Year = '1' then 'TP-F-TP1'
when AOS = 'batp' and Year = '2' then 'TP-F-TP2'
when AOS = 'batp' and Year = '3' then 'TP-F-TP3'
else 'XXX'
end as [Course Offering Code]
然后,当AOS ='batp'返回第二行时,我需要每个
case
when AOS = 'batp' and Session = 'CC' then 'TP-F-CC'
when AOS = 'batp' and Session = 'SM' then 'TP-F-SM'
when AOS = 'batp' and Session = 'PM' then 'TP-F-PM'
else 'XXX'
end as [Course Offering Code]
所以我想要这样的结果
Type ID Role Course Offering Code
-------------------------------------------------
ENROLL 741258 Student TP-F-TP2
ENROLL 741258 Student TP-F-CC
答案 0 :(得分:0)
不确定完整的逻辑,但对于提供的示例,可以使用UNION ALL来实现,而无需循环
示例:
DECLARE @tb TABLE (ID INT, AOS VARCHAR(50), Session VARCHAR(50), Year INT)
INSERT INTO @tb
VALUES
(741258, 'BATP', 'CC2', 2),
(456789, 'BATP', 'TS1', 1),
(963741, 'BATP', 'SM3', 3),
(456123, 'BATP', 'PM2', 2),
(687459, 'MACP', 'CP1', 1),
(753951, 'MAAS', 'AS1', 1)
SELECT * FROM (
SELECT
[Type] = 'ENROLL'
, ID
, [Role] = 'Student'
, CourseOffer =
CASE
WHEN LOWER(AOS) = 'batp' AND [Year] = 1 THEN 'TP-F-TP1'
WHEN LOWER(AOS) = 'batp' AND [Year] = 2 THEN 'TP-F-TP2'
WHEN LOWER(AOS) = 'batp' AND [Year] = 3 THEN 'TP-F-TP3'
ELSE 'XXX'
END
FROM @tb
UNION ALL
SELECT
'ENROLL'
, ID
, 'Student'
, CourseOffer =
CASE
WHEN LOWER(AOS) = 'batp' AND LEFT([Session],2) = 'CC' THEN 'TP-F-CC'
WHEN LOWER(AOS) = 'batp' AND LEFT([Session],2) = 'SM' THEN 'TP-F-SM'
WHEN LOWER(AOS) = 'batp' AND LEFT([Session],2) = 'PM' THEN 'TP-F-PM'
ELSE 'XXX'
END
FROM @tb
) D
WHERE
ID = 741258
ORDER BY ID
我认为有一种更简单的方法可以做到这一点,只需要您知道使之成为可能的完整逻辑即可。