2013-12-02 6 views
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 ouput

Я хотел бы получить выход для последовательного номер каждой записи, где отсчет (*) столбец, начиная с 1 на каждой новой группы, и поместите итог в нижней части группы, но я не уверен, как это сделать. Я пробовал свертывание в разных частях группы по выражению, но это заканчивается, давая промежуточные итоги для дат, периодов и т. Д. Мне нужно, чтобы он был ТОЛЬКО для ученика (либо s.dcid, либо s.lastfirst)

[Дополнительная информация по запросу ...]

Я надеюсь получить отчет, в котором мои конечные пользователи могут искать студентов, которые имеют заданное количество записей посещаемости в диапазоне дат. Например, если конечный пользователь хочет найти студентов, у которых есть 20 отсутствий между 10/1/2013 и 10/31/2013, где 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 в каждой из трех групп с «...» Я не» я хочу, чтобы буквально выводить это.

+0

Есть ли у вас пример нужного выхода? Какова структура ваших таблиц? Как вы определяете «группу»? ... и можете ли вы отправить [SQLFIDDLE] (http://sqlfiddle.com) несколько выборочных данных? – MT0

ответ

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() также всегда один (как это, кажется, максимальный размер каждой группы).

Если это не так, тогда вам нужно будет быть менее ограничительным в своем предложении GROUP BY - однако вы не указали достаточно информации о том, что вы ожидаете от запроса, чтобы я мог внести какие-либо изменения.

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