Форум программистов
 

Восстановите пароль или Зарегистрируйтесь на форуме, о проблемах и с заказом рекламы пишите сюда - alarforum@yandex.ru, проверяйте папку спам!

Вернуться   Форум программистов > Delphi программирование > БД в Delphi
Регистрация

Восстановить пароль
Повторная активизация e-mail

Купить рекламу на форуме - 42 тыс руб за месяц

Ответ
 
Опции темы Поиск в этой теме
Старый 07.11.2009, 11:03   #1
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
Восклицание Firebird. Расчет количества.

Добрый день всем! Прошу помочь в решении следующей проблемы. Мне нужно, чтобы подсчитывалось количество всех оценок для учащегося с заданным ID, в указанном диапозоне четверти. C горем попалам я допетрил каким должен быть приблизительный запрос (по крайней мере я так думаю ):
Код:
procedure TForm1.sBitBtn60Click(Sender: TObject);
begin
 Form1.pFIBDataSet_raschet.Close;
 Form1.pFIBDataSet_raschet.SQLs.SelectSQL.Clear;
 Form1.pFIBDataSet_raschet.SQLs.SelectSQL.Text:='SELECT COUNT(OCENKA) FROM MARK,SPISOK WHERE (MARK.WITHSPISOK=SPISOK.ID) AND (WITHSPISOK=2) and (OCENKA=4)';
 Form1.pFIBDataSet_raschet.Open;
 Form1.SG2.Cells[0,1]:=IntToStr(Form1.pFIBDataSet_raschet.FieldByName('OCENKA').AsInteger);
end;
. Подсчитывается количество всех 4-ок для ученика с заданным ID (WITHSPISOK). Диапозон не указан, т.к. я пытался придумать запрос. Нужно, чтобы в этом запросе было еще вот что: Начальная и конечная дата четверти, и чтобы считалось не только один тип оценки, но 2-ки, 3-ки, 4-ки, 5-ки и чтобы их количество выводилось в таблицу. Потом придется цикл мутить . Помогите подалуйста в составлении правильного запроса. Я не прошу сделать за меня, я прошу помочь мне. Надеюсь на вашу помощь.
Вложения
Тип файла: doc Таблицы №3.doc (102.0 Кб, 13 просмотров)
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.

Последний раз редактировалось artemavd; 07.11.2009 в 11:07.
artemavd вне форума Ответить с цитированием
Старый 07.11.2009, 11:50   #2
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Ну если в лоб запрос писать, то как-то так:
Код:
select m.ocenka, count(m.ocenka)
from spisok s, mark m
where (s.id = :spisok_id) and (m.withspisok = s.id) and
      (m.datamark >= :date_from) and (m.datamark <= :date_to)
group by m.ocenka
параметры:
spisok_id - ID ученика,
date_from - начало четверти
date_to - конец четверти
Как в FIB'е с параметрами работать я уже не помню, но с датами лучше через параметры именно работать, а не строкой их передавать.
Ищите в своём pFIBDataSet_raschet свойство типа Params / Parameters / ParamByName / ... точно не помню как оно там называется
pu4koff вне форума Ответить с цитированием
Старый 07.11.2009, 17:10   #3
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

Не получилось применить Ваш код, pu4koff . Я пробовал делать так:
Код:
select m.ocenka, count(m.ocenka)
from spisok s, mark m
where (s.id = 1) and (m.withspisok = s.id) and (m.datamark >= '01.09.2009')
                 and (m.datamark <= '01.09.2009')
group by m.ocenka
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 07.11.2009, 17:29   #4
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Что это за чудо:
where (s.id = 1) and (m.withspisok = s.id)
Не проще ли
where (m.withspisok = 1) ?
На кой вообще привлекать таблицу spisok ?
mihali4 вне форума Ответить с цитированием
Старый 07.11.2009, 17:30   #5
Yurk@
Участник клуба
 
Аватар для Yurk@
 
Регистрация: 19.12.2007
Сообщений: 1,100
Подмигивание

artemavd, а что конкретно не получается ???

mihali4, ну это он для примера вбил (s.id = 1) .... в оригинале его не должно быть

P.S. возможно мой примерчик поможет:
Код:
SELECT
(select count (comp_id) from program_list where program_id=12) as count_12,
(select count (comp_id) from program_list where program_id=5) as count_5
FROM program_list
WHERE program_id=12
GROUP BY program_id
На форуме: Помогаю за спасибо
ICQ\Skype: Это моё личное время ...

Последний раз редактировалось Yurk@; 07.11.2009 в 17:56.
Yurk@ вне форума Ответить с цитированием
Старый 07.11.2009, 18:33   #6
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

Цитата:
Сообщение от artemavd Посмотреть сообщение
Не получилось применить Ваш код, pu4koff .
В чём это проявилось? Код убежал и не вернулся?
Цитата:
Сообщение от mihali4 Посмотреть сообщение
Что это за чудо:
where (s.id = 1) and (m.withspisok = s.id)
Не проще ли
where (m.withspisok = 1) ?
На кой вообще привлекать таблицу spisok ?
Действительно. Чота я лоханулся. Привык, что обычно фамилия требуется или еще какая инфа. Что-то сталося с внимательностью моею
pu4koff вне форума Ответить с цитированием
Старый 07.11.2009, 19:19   #7
artemavd
Старожил
 
Аватар для artemavd
 
Регистрация: 05.06.2008
Сообщений: 4,206
По умолчанию

mihali4, я исправил:
Код:
select m.ocenka, count(m.ocenka)
from spisok s, mark m
where (m.withspisok = 1) and (m.datamark >= '01.09.2009')
                 and (m.datamark <= '01.09.2009')
group by m.ocenka
Но в результате запроса возвращается null. А таблица то не пустая.
В запросе же не указывается какой именно тип оценки надо считать. Ведь так?
Не стоит смеяться над человеком делающим шаг назад, возможно он делает разбег.
artemavd вне форума Ответить с цитированием
Старый 07.11.2009, 19:30   #8
pu4koff
Старожил
 
Аватар для pu4koff
 
Регистрация: 22.05.2007
Сообщений: 9,065
По умолчанию

1. from spisok s, mark m // не нужно тут spisok s
Код:
select ocenka, count(ocenka) from mark where (withspisok = 1) 
and (datamark >= '01.09.2009') and (datamark < '01.09.2009') group by ocenka
2. На эту дату оценки точно есть? Запрос в своей программе тестируется или через IBExpert?

Последний раз редактировалось mihali4; 07.11.2009 в 19:59.
pu4koff вне форума Ответить с цитированием
Старый 07.11.2009, 19:57   #9
mihali4
*
Старожил
 
Регистрация: 22.11.2006
Сообщений: 9,201
По умолчанию

Видимо, дело в несовпадении форматов даты...
mihali4 вне форума Ответить с цитированием
Старый 07.11.2009, 20:35   #10
Serge_Bliznykov
Старожил
 
Регистрация: 09.01.2008
Сообщений: 26,229
По умолчанию

Артём, в Вашем коде как минимум ДВЕ ошибки:
таблицы spisok s, mark m
НЕ СВЯЗАНЫ условием в WHERE
но это дало бы то, что записи выбрались количество в s (отвечающих условиям where) * на количество в m (отвечающих условиям where)
раз записи не выбираются, значит уловия отбора оценок
НЕВЕРНЫ.

второе.
А что за условие дата оценки БОЛЬШЕ и равна 1сентября и дата оценки МЕНЬШЕ и равна 1сентября.
Хотите увидеть оценки только за 1-е сентября?!
ну так и пишите дата = первое сентября.. к чему этот мазохизм?!


и я бы ещё "грешил" на формат даты
например, что такой запрос даёт?
Код:
select m.* from mark m
where m.datamark <= '01.09.2009'
не пустой? точно там только оценки до первого сентября включительно?

p.s. пока писал ответ уже почти все мои мысли высказали
Serge_Bliznykov вне форума Ответить с цитированием
Ответ


Купить рекламу на форуме - 42 тыс руб за месяц

Опции темы Поиск в этой теме
Поиск в этой теме:

Расширенный поиск


Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Сложный расчет З/П VictorM Microsoft Office Excel 7 08.11.2009 16:51
Расчет зума Саня_Д Microsoft Office Excel 4 21.10.2009 15:21
Расчет количества в БД Excell, использование сводных таблиц? ITM Microsoft Office Excel 10 12.01.2009 14:41
Расчет средневзешенного zoman Microsoft Office Excel 2 05.12.2007 10:15