【问题标题】:How to number lines, with total at end?如何对行进行编号,最后是总数?
【发布时间】: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


【解决方案1】:

毫无疑问,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 子句中减少限制 - 但是您没有提供足够的信息来说明您希望查询对我进行任何更改。

【讨论】:

    【解决方案2】:

    使用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');
    

    【讨论】:

      猜你喜欢
      • 2015-06-27
      • 2017-01-18
      • 2021-11-07
      • 1970-01-01
      • 2018-03-23
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多