加入 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 | |
+------------+-----------+--------+---------+-------------+
已解决。
请参阅严重错误的最后一段代码。
学生缺席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 | |
+------------+-----------+--------+---------+-------------+
已解决。 请参阅严重错误的最后一段代码。