|
|
Регистрация | << Правила форума >> | FAQ | Пользователи | Календарь | Поиск | Сообщения за сегодня | Все разделы прочитаны |
|
Опции темы | Поиск в этой теме | Опции просмотра |
#1
|
|||
|
|||
Суммирование полей с последующим выводом результата
Уважаемые программисты!
Нужна ваша помощь! У меня возникла проблема, вот какого плана. Мне необходимо организовать подчет суммы поле с условиями. Имеется БД в ней таблицы stud и propuski, руководитель потребовал сделать своего рода отчет по пропускам группы, он выглядит следующим образом: в гриде должна отображается табличка такого вида: |фамилия|кол-во пропусков по уважительной причине|кол-во пропусков по не уважительной причине| Необходимо вывести сумму пропущенных часов за заданный период по каждому студенту из выбранной группы. Как это реализовать программно? Использую ADO-Access. Кто с таким сталкивался или хотябы примерно знает как это сделать, прошу помощи!! |
#2
|
|||
|
|||
Поправка.
Перефразирую проблему, необходимо посчитать сумму пропущенных часов группы в частности по каждому студенту в отдельности, уважительных и не уважительных за выбранный период и вывести в грид с последующим экспортом в Excel(ну с этим у меня проблем нет) в гриде фамилии студентов выбранной группы, а напротив в ячейках сумма пропусков по двум критериям (ув.) и (неув.), я так думаю надо организовать цикл, а как его представать в работоспособном коде я не могу, у меня не получается…при попытке написания выводятся все записи с фамилиями студентов за заданный период и происходит подсчет по всем фамилиям а не по одной как необходимо...
Кто может помочь?? Очень надо скоро сдача а руководитель принципиален и не идёт на уступки |
#3
|
|||
|
|||
Цитата:
Запрос с группировкой: Код:
select s.fio, sum(p.uv) as uvaj, sum(p.nuv) as neuvaj from stud s, propuski p where s.kod = p.kod group by s.fio И выводиш его в грид Используешь ADOQuery Лучшще кидани исходник проги... Я тебе там вставлю Или сам понял? И вообще учи SQL в жизни пригождится |
#4
|
|||
|
|||
Могу предложить один вариант.
С помощью запроса получить таблицу (фамилия, вид пропуска, кол-во пропусков). А потом уже этот запрос обрабатывать и приводить к тому виду что тебе надо через цикл. Код:
With adoQuery1 do begin Close; SQL.Clear; SQL.Add('SELECT familia,vid_propuska,COUNT(vid_propuska) from propuski, stud'); SQL.Add('WHERE stud.code_s=propuski.code_s'); SQL.Add('group by familia,vid_propuska'); Open; end; |
#5
|
|||
|
|||
Цитата:
voron_paa Хм... понять то понел, да не совсем А можно пояснить для особо "одарённых??" Цитата:
Да таблица получается, ток я не совсем понимаю какого вида цикл надо использывать... Напомню вид нужной таблици в гриде: |Фамилия|Сумма часов пропущенных по ув. причине|Сумма часов пропущенных по неув. причине| Вот исходник, по нему наверно проще будет объяснить, показать. |
#6
|
|||
|
|||
Я вначале неправильно понял, там считал кол-во пропусков, а не кол-во часов.
|
#7
|
|||
|
|||
Цитата:
MegaPiha Благодарен тебе!! Но, мне необходимо подсчет не по всем студентам а по студентам выбранной группы и в добавок к этому и за определенный период. Пытаюсь сам поправить запрос но постоянно ругается, может я что-то не так делаю, первый раз вижу такую ошибку?? "Попытка выполнить запрос, который не включает указанное вложение 'Gruppa' как части синтаксической функции или группы " Код:
With adoQuery3 do begin Close; SQL.Clear; SQL.Add('SELECT stud.familia,propuski.vid_propuska,sum(kol_vo_chas) as cnt,stud.Gruppa,propuski.data from propuski, stud'); SQL.Add('WHERE stud.code_s=propuski.code_s'); SQL.Add('AND s.Gruppa = :g'); SQL.Add('AND p.data BETWEEN :dn AND :dk '); SQL.Add('group by familia,vid_propuska'); Parameters.ParseSQL(SQL.Text,true); Parameters.ParamByName('g').Value:= ComboBox2.Text; Parameters.ParamByName('dn').Value:= DateTimePicker1.Date; Parameters.ParamByName('dk').Value:= DateTimePicker2.Date; Open; Мне жутко стыдно просить, но всё же, помоги, очень нужно!! Пажалуйста! |
#8
|
|||
|
|||
Так запрос сам исравил, но теперь сумма часов выводится не првавильная...пытался найти где идет ошибка при подсчете, понел что он не считает а выводит просто последнюю запись по каждой фамилии или я ошибаюсь, но он точно считает не правилино...
вот как исправил запрос: Код:
With adoQuery3 do begin Close; SQL.Clear; SQL.Add('SELECT stud.familia,propuski.vid_propuska,sum(kol_vo_chas) as cnt,stud.Gruppa,propuski.data from propuski, stud'); SQL.Add('WHERE stud.code_s=propuski.code_s'); SQL.Add('AND stud.Gruppa = :g'); SQL.Add('AND propuski.data BETWEEN :dn AND :dk '); SQL.Add('group by familia,vid_propuska,propuski.data,stud.Gruppa'); SQL.Add('ORDER BY stud.familia'); Parameters.ParseSQL(SQL.Text,true); Parameters.ParamByName('g').Value:= ComboBox2.Text; Parameters.ParamByName('dn').Value:= DateTimePicker1.Date; Parameters.ParamByName('dk').Value:= DateTimePicker2.Date; Open; Последний раз редактировалось Жулик, 13.06.2008 в 23:08. |
#9
|
|||
|
|||
Попробуй поменять порядок группировки
propuski.data,stud.Gruppa,familia,vid_propuska |
#10
|
|||
|
|||
Цитата:
Неа не помогло, тоже самое выводит... |
#11
|
|||
|
|||
Код:
With adoQuery3 do begin Close; SQL.Clear; SQL.Add('SELECT familia,propuski.vid_propuska,sum(kol_vo_chas) as cnt,stud.Gruppa from propuski, stud'); SQL.Add('WHERE stud.code_s=propuski.code_s'); SQL.Add('AND stud.Gruppa = :g'); SQL.Add('AND propuski.data BETWEEN :dn AND :dk '); SQL.Add('group by stud.Gruppa,familia,vid_propuska'); SQL.Add('ORDER BY familia'); Parameters.ParseSQL(SQL.Text,true); Parameters.ParamByName('g').Value:= ComboBox2.Text; Parameters.ParamByName('dn').Value:= DateTimePicker1.Date; Parameters.ParamByName('dk').Value:= DateTimePicker2.Date; Open; end; |
#12
|
|||
|
|||
Цитата:
MegaPiha Спасибо тебе огромное!!! Оказывается всё просто. Убедился, что моногому нужно учиться... Цитата:
А какую литературу по нему посоветуешь ты, да и все здесь присутствующие?? |
#13
|
|||
|
|||
Цитата:
|