0

我当前的sql:

select s.dcid, substr(s.lastfirst,0,3),  to_char(a.att_date, 'mm/dd/yyyy'), a.periodid, p.name,     a.attendance_codeid, ac.att_code, count(*)

from students s
join attendance a on s.id = a.studentid
join period p on a.periodid = p.id
join attendance_code ac on a.attendance_codeid = ac.id

WHERE ac.att_code IS NOT NULL 
AND s.schoolid = 109
AND s.enroll_status = 0
AND s.student_number = 100887
AND a.att_date >= to_date('08/15/2013', 'mm/dd/yyyy')


group by s.dcid, s.lastfirst,  to_char(a.att_date, 'mm/dd/yyyy'), a.periodid, p.name, a.attendance_codeid, ac.att_code

输出: sql输出

我想让输出按顺序编号 count(*) 列所在的每条记录,从每个新组的 1 开始,并将总数放在组的底部,但我不知道该怎么做. 我已经尝试通过表达式在组的各个部分汇总,但它最终给出了日期、周期等的小计……我只需要为学生总计(s.dcid 或 s.lastfirst)

[每个请求的附加信息...]

我希望获得一个报告,我的最终用户可以在其中搜索在某个日期范围内具有给定数量出勤记录的学生。例如,如果最终用户想要查找在 2013 年 10 月 1 日到 2013 年 10 月 31 日之间缺勤 20 次的学生,其中 att_code 是 A、C、E、G... 等之一。一旦报告运行,我想向他们展示缺席发生的日期,以及用作视觉验证找到的记录确实符合他们的搜索条件的代码。

输出应该看起来像当前输出,但 COUNT(*) 列除外,这是我现在挂断的地方。我喜欢 row_number 如何按顺序编号每条记录,但我仍在寻找的是如何在组(学生)更改时重置顺序编号。

例如...

DCID  S.LASTFIRST  A.ATT_DATE  PERIODID  NAME  ATT_CODE  COUNT(or # or Num...)
1006  Aco          08/29/2013      1704  4     W             1
1006  Aco          09/03/2013      1701  1     6             2
1006  Aco          09/05/2013      1706  6     G             3
...
1006  Aco          10/04/2013      1706  6     z            20
2543  Bro          08/29/2013      1704  4     W             1
2543  Bro          09/03/2013      1701  1     6             2
2543  Bro          09/05/2013      1706  6     G             3
...
2543  Bro          10/04/2013      1706  6     z            20
3121  Com          08/29/2013      1704  4     W             1
3121  Com          09/03/2013      1701  1     6             2
3121  Com          09/05/2013      1706  6     G             3
...
3121  Com          10/04/2013      1706  6     z            20

当然,在此示例中,我通过将三个组中的每一个中的行号 4 - 19 替换为“...”来缩写输出,我不想从字面上输出它。

4

2 回答 2

0

使用ROW_NUMBER函数如下:

SELECT s.dcid,
       SUBSTR (s.lastfirst, 0, 3),
       TO_CHAR (a.att_date, 'mm/dd/yyyy'),
       a.periodid,
       p.name,
       a.attendance_codeid,
       ac.att_code,
       ROW_NUMBER() OVER (ORDER BY s.dcid) AS rownumber
       -- I have ordered by s.dcid. You can order by whichever column you want.
  FROM students s
       JOIN attendance a ON s.id = a.studentid
       JOIN period p ON a.periodid = p.id
       JOIN attendance_code ac ON a.attendance_codeid = ac.id
 WHERE     ac.att_code IS NOT NULL
       AND s.schoolid = 109
       AND s.enroll_status = 0
       AND s.student_number = 100887
       AND a.att_date >= TO_DATE ('08/15/2013', 'mm/dd/yyyy');
于 2013-12-03T04:26:51.310 回答
0

不出所料,ROW_NUMBER()分析函数将使用您指定的分区和排序顺序对行进行编号。

select s.dcid,
       substr(s.lastfirst,0,3),
       to_char(a.att_date, 'mm/dd/yyyy'),
       a.periodid,
       p.name,
       a.attendance_codeid,
       ac.att_code,
       ROW_NUMBER() OVER ( ORDER BY s.dcid )
from students s
join attendance a on s.id = a.studentid
join period p on a.periodid = p.id
join attendance_code ac on a.attendance_codeid = ac.id

WHERE ac.att_code IS NOT NULL 
AND s.schoolid = 109
AND s.enroll_status = 0
AND s.student_number = 100887
AND a.att_date >= to_date('08/15/2013', 'mm/dd/yyyy')
GROUP BY s.dcid,
         s.lastfirst,
         to_char(a.att_date, 'mm/dd/yyyy'),
         a.periodid,
         p.name,
         a.attendance_codeid,
         ac.att_code;

从您的屏幕截图中,该COUNT()列始终为 1,因此ROW_NUMBER()也将始终为 1(因为这似乎是每个组的最大大小)。

如果情况并非如此,那么您将需要在您的GROUP BY子句中减少限制 - 但是您没有提供足够的信息来说明您希望查询为我做的任何更改。

于 2013-12-03T01:17:28.663 回答