加入 DB tables:在第 table 秒内为每个组重复一个 table 中的值

Joining DB tables: repeat values in one table for each group in second table

学生缺席classes,我要计算连续缺勤。 'Date' table 包含学年的所有日期,并指示学校是否在上课。周末或节假日不开会。 'Absence' table 列出学生以及他们缺席特定 class 的日期。我需要列出每个 'CLASS' 组的所有日期,以查看是否连续几天错过了 class。我已经尝试过 CROSS JOIN,但无法正常工作。也许 ROW_NUMBER 可以使用。欢迎任何类型的解决方案!

开学日期 table。学生缺勤 table 天,其中 class。最后一张图是table我要创作的。我想为每个 Student/Class 组

重复范围内的日期

尝试如下操作。您可以在 SSMS 中 运行 这个例子。

DECLARE @Absent table ( stu_id varchar(10), class varchar(10), absent_date date );
INSERT INTO @Absent VALUES
    ( 'Billie', 'English', '11/03/2020' ),
    ( 'Billie', 'Math', '11/10/2020' ),
    ( 'Billie', 'Math', '11/12/2020' ),
    ( 'Billie', 'Science', '11/19/2020' ),
    ( 'Billie', 'Math', '11/19/2020' );

DECLARE @InSession table ( CalDate date, InSession bit );
INSERT INTO @InSession VALUES
    ( '11/02/2020', 1 ),( '11/03/2020', 1 ),( '11/04/2020', 1 ),( '11/05/2020', 1 ),( '11/06/2020', 1 ),( '11/07/2020', 0 ),( '11/08/2020', 0 ),
    ( '11/09/2020', 1 ),( '11/10/2020', 1 ),( '11/11/2020', 0 ),( '11/12/2020', 1 ),( '11/13/2020', 1 ),( '11/14/2020', 0 ),
    ( '11/15/2020', 0 ),( '11/16/2020', 1 ),( '11/17/2020', 1 ),( '11/18/2020', 1 ),( '11/19/2020', 1 ),( '11/20/2020', 0 );

SELECT DISTINCT
    FORMAT ( s.CalDate, 'MM/dd/yyyy' ) AS CalDate,
    s.InSession,
    a.stu_id,
    CASE 
        WHEN a.absent_date = s.CalDate THEN a.class
        ELSE ''
    END AS class,
    CASE
        WHEN a.absent_date = s.CalDate THEN FORMAT ( a.absent_date, 'MM/dd/yyyy' )
        ELSE ''
    END AS absent_date
FROM @InSession AS s
CROSS APPLY @Absent AS a
ORDER BY
    s.CalDate;

Returns

+------------+-----------+--------+---------+-------------+
|  CalDate   | InSession | stu_id |  class  | absent_date |
+------------+-----------+--------+---------+-------------+
| 2020-11-02 |         1 | Billie |         |             |
| 2020-11-03 |         1 | Billie |         |             |
| 2020-11-03 |         1 | Billie | English | 11/03/2020  |
| 2020-11-04 |         1 | Billie |         |             |
| 2020-11-05 |         1 | Billie |         |             |
| 2020-11-06 |         1 | Billie |         |             |
| 2020-11-07 |         0 | Billie |         |             |
| 2020-11-08 |         0 | Billie |         |             |
| 2020-11-09 |         1 | Billie |         |             |
| 2020-11-10 |         1 | Billie |         |             |
| 2020-11-10 |         1 | Billie | Math    | 11/10/2020  |
| 2020-11-11 |         0 | Billie |         |             |
| 2020-11-12 |         1 | Billie |         |             |
| 2020-11-12 |         1 | Billie | Math    | 11/12/2020  |
| 2020-11-13 |         1 | Billie |         |             |
| 2020-11-14 |         0 | Billie |         |             |
| 2020-11-15 |         0 | Billie |         |             |
| 2020-11-16 |         1 | Billie |         |             |
| 2020-11-17 |         1 | Billie |         |             |
| 2020-11-18 |         1 | Billie |         |             |
| 2020-11-19 |         1 | Billie |         |             |
| 2020-11-19 |         1 | Billie | Math    | 11/19/2020  |
| 2020-11-19 |         1 | Billie | Science | 11/19/2020  |
| 2020-11-20 |         0 | Billie |         |             |
+------------+-----------+--------+---------+-------------+

请注意,在 11/19/2020 Billie 被标记为缺席两个 类,创建当天的多个结果。

除了报告缺席的日子,除了“缺席”行之外,您还会收到一个空白行。我正在寻找是否可以解决这部分问题。

更新

删除了缺席日的“空”行。

SELECT DISTINCT
        s.CalDate,
        s.InSession,
        a.stu_id,
        ISNULL ( x.class, '' ) AS class,
        ISNULL ( x.absent_date, '' ) AS absent_date
    FROM @InSession AS s
    CROSS APPLY @Absent AS a
    OUTER APPLY (
        
        SELECT
            ab.class, CONVERT ( varchar(10), ab.absent_date, 101 ) AS absent_date
        FROM @Absent AS ab
        WHERE
            ab.stu_id = a.stu_id
            AND ab.absent_date = s.CalDate

    ) AS x
    ORDER BY
        s.CalDate, stu_id, absent_date;

Returns

+------------+-----------+--------+---------+-------------+
|  CalDate   | InSession | stu_id |  class  | absent_date |
+------------+-----------+--------+---------+-------------+
| 2020-11-02 |         1 | Billie |         |             |
| 2020-11-03 |         1 | Billie | English | 11/03/2020  |
| 2020-11-04 |         1 | Billie |         |             |
| 2020-11-05 |         1 | Billie |         |             |
| 2020-11-06 |         1 | Billie |         |             |
| 2020-11-07 |         0 | Billie |         |             |
| 2020-11-08 |         0 | Billie |         |             |
| 2020-11-09 |         1 | Billie |         |             |
| 2020-11-10 |         1 | Billie | Math    | 11/10/2020  |
| 2020-11-11 |         0 | Billie |         |             |
| 2020-11-12 |         1 | Billie | Math    | 11/12/2020  |
| 2020-11-13 |         1 | Billie |         |             |
| 2020-11-14 |         0 | Billie |         |             |
| 2020-11-15 |         0 | Billie |         |             |
| 2020-11-16 |         1 | Billie |         |             |
| 2020-11-17 |         1 | Billie |         |             |
| 2020-11-18 |         1 | Billie |         |             |
| 2020-11-19 |         1 | Billie | Math    | 11/19/2020  |
| 2020-11-19 |         1 | Billie | Science | 11/19/2020  |
| 2020-11-20 |         0 | Billie |         |             |
+------------+-----------+--------+---------+-------------+

更新

所以我想要日期范围,11 月 2 日至 20 日,对原始数据中包含的每个 CLASS 和每个学生重复。

试试这个:

SELECT
    CalDate,
    InSession,
    stu_id,
    class,
    MAX ( absent_date ) AS absent_date
FROM (

    SELECT DISTINCT
        CalDate,
        InSession,
        stu_id, 
        x.class,
        CASE
            WHEN x.absent_date = CalDate THEN CONVERT ( varchar(10), x.absent_date, 101 )
            ELSE ''
        END AS absent_date
    FROM @InSession AS i
    CROSS APPLY @Absent AS a
    OUTER APPLY (
        
            SELECT
                ab.class, CONVERT ( varchar(10), ab.absent_date, 101 ) AS absent_date
            FROM @Absent AS ab
            WHERE
                ab.stu_id = a.stu_id
                AND ab.absent_date = a.absent_date

        ) AS x
    WHERE
        i.CalDate BETWEEN '11/02/2020' AND '11/30/2020'

) AS StudentAbsent
GROUP BY
    CalDate, InSession, stu_id, class
ORDER BY
    stu_id, class, CalDate;

Returns

+------------+-----------+--------+---------+-------------+
|  CalDate   | InSession | stu_id |  class  | absent_date |
+------------+-----------+--------+---------+-------------+
| 2020-11-02 |         1 | Billie | English |             |
| 2020-11-03 |         1 | Billie | English | 11/03/2020  |
| 2020-11-04 |         1 | Billie | English |             |
| 2020-11-05 |         1 | Billie | English |             |
| 2020-11-06 |         1 | Billie | English |             |
| 2020-11-07 |         0 | Billie | English |             |
| 2020-11-08 |         0 | Billie | English |             |
| 2020-11-09 |         1 | Billie | English |             |
| 2020-11-10 |         1 | Billie | English |             |
| 2020-11-11 |         0 | Billie | English |             |
| 2020-11-12 |         1 | Billie | English |             |
| 2020-11-13 |         1 | Billie | English |             |
| 2020-11-14 |         0 | Billie | English |             |
| 2020-11-15 |         0 | Billie | English |             |
| 2020-11-16 |         1 | Billie | English |             |
| 2020-11-17 |         1 | Billie | English |             |
| 2020-11-18 |         1 | Billie | English |             |
| 2020-11-19 |         1 | Billie | English |             |
| 2020-11-20 |         0 | Billie | English |             |
| 2020-11-02 |         1 | Billie | Math    |             |
| 2020-11-03 |         1 | Billie | Math    |             |
| 2020-11-04 |         1 | Billie | Math    |             |
| 2020-11-05 |         1 | Billie | Math    |             |
| 2020-11-06 |         1 | Billie | Math    |             |
| 2020-11-07 |         0 | Billie | Math    |             |
| 2020-11-08 |         0 | Billie | Math    |             |
| 2020-11-09 |         1 | Billie | Math    |             |
| 2020-11-10 |         1 | Billie | Math    | 11/10/2020  |
| 2020-11-11 |         0 | Billie | Math    |             |
| 2020-11-12 |         1 | Billie | Math    | 11/12/2020  |
| 2020-11-13 |         1 | Billie | Math    |             |
| 2020-11-14 |         0 | Billie | Math    |             |
| 2020-11-15 |         0 | Billie | Math    |             |
| 2020-11-16 |         1 | Billie | Math    |             |
| 2020-11-17 |         1 | Billie | Math    |             |
| 2020-11-18 |         1 | Billie | Math    |             |
| 2020-11-19 |         1 | Billie | Math    | 11/19/2020  |
| 2020-11-20 |         0 | Billie | Math    |             |
| 2020-11-02 |         1 | Billie | Science |             |
| 2020-11-03 |         1 | Billie | Science |             |
| 2020-11-04 |         1 | Billie | Science |             |
| 2020-11-05 |         1 | Billie | Science |             |
| 2020-11-06 |         1 | Billie | Science |             |
| 2020-11-07 |         0 | Billie | Science |             |
| 2020-11-08 |         0 | Billie | Science |             |
| 2020-11-09 |         1 | Billie | Science |             |
| 2020-11-10 |         1 | Billie | Science |             |
| 2020-11-11 |         0 | Billie | Science |             |
| 2020-11-12 |         1 | Billie | Science |             |
| 2020-11-13 |         1 | Billie | Science |             |
| 2020-11-14 |         0 | Billie | Science |             |
| 2020-11-15 |         0 | Billie | Science |             |
| 2020-11-16 |         1 | Billie | Science |             |
| 2020-11-17 |         1 | Billie | Science |             |
| 2020-11-18 |         1 | Billie | Science |             |
| 2020-11-19 |         1 | Billie | Science | 11/19/2020  |
| 2020-11-20 |         0 | Billie | Science |             |
+------------+-----------+--------+---------+-------------+

已解决。 请参阅严重错误的最​​后一段代码。