如何使用循环为单个表格行返回多个结果

时间:2019-07-24 15:45:56

标签: sql tsql

我正在编写一个脚本来创建一个.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

1 个答案:

答案 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 

我认为有一种更简单的方法可以做到这一点,只需要您知道使之成为可能的完整逻辑即可。