【发布时间】:2013-12-18 20:04:21
【问题描述】:
我当前的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
输出:
我想让输出按顺序编号 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 替换为“...”来缩写输出。我不想逐字输出。
【问题讨论】:
-
你有你想要的输出的例子吗?你的桌子的结构是什么?你如何定义一个“组”? ...您可以发布带有一些示例数据的SQLFIDDLE 吗?
标签: sql oracle group-by cumulative-sum rollup