Форум: "Базы";
Текущий архив: 2002.06.24;
Скачать: [xml.tar.bz2];
ВнизХитрый репорт-2 Найти похожие ветки
← →
Manul (2002-05-30 22:38) [0]Прошу прощения за недостаточность первого вопроса.
Дело обстоит гораздо сложнее.
Для большей ясности приведу пример отчета
Group header
Налоговая инспекция
Group header
Штраф
Detail
Статья 146 2 2500
Статья 152 3 1200
Group footer
Количество штрафов 5
На сумму 3700
Group header
Предупреждение
Detail
Статья 121 3
Статья 176 3
Group footer
Количество предпреждений 6
На сумму
Group footer
Количество протоколов по Налоговая инспекция 11
На сумму 3700
Соответственно каждому протоколу соответствует одна запись в базе. Как посчитать количество протоколов и суммы в отчете?
← →
fnatali (2002-05-31 06:01) [1]Как вообще выглядит структура базы? То есть в одном протоколе у тебя и штраф и предупреждение? Если это так, то сначала сделай запрос с использованием union - для штрафов и для предупреждений с группировками. Затем, как и советовали ранее - QRExpr. Например
select ...,sum(кол) where pole="штрафы" group by ...
union
select ...,sum(кол) where pole="предупреждения" group by ...
← →
Manul (2002-05-31 07:12) [2]To fnatali
База достаточно проста как таковая.
Есть несколько таблиц, одна из которых основная все остальные справочники. В основной таблице храню номер протокола, фамилию нарушителя, название организации составителя, статью КоАП, вид взыскания, сумма взыскания (если это штраф), признак оплаты.
По осдному составителю могут быть и предупреждения и штрафы. Предупреждения и штрафы могут быть по одинаковым статьям. Вот и не получается в отчете получить суммарное кол-во протоколов по каждой статье, взысканию, составителю. И суммы по взысканию, составителю.
Вот запрос котороый я использую:
SELECT sost.sost, vzys.vzys, stat.stat, sum(prot.summa) as summa
FROM prot INNER JOIN sost on prot.n_sost=sost.n_sost
INNER JOIN stat ON prot.n_stat=stat.n_stat
INNER JOIN vzys ON prot.n_vzys=vzys.n_vzys
where prot.d_pos between "01.01.2002" and "31.01.2002"
GROUP BY sost.sost, vzys.vzys, stat.stat
ORDER BY sost.sost
← →
Deniz (2002-05-31 07:53) [3]ORDER BY sost.sost - не надо
Для кол-ва нужно добавить count(prot.№протокола) поле <№протокола> должно быть заполнено всегда.
Если я правильно понял vzys.vzys - вид взыскания (штраф/предупр).
Вроде все. Теперь имеем запрос типа:
SELECT sost.sost, vzys.vzys, stat.stat, count(prot.№протокола) as kolvo, sum(prot.summa) as summa
FROM prot INNER JOIN sost on prot.n_sost=sost.n_sost
INNER JOIN stat ON prot.n_stat=stat.n_stat
INNER JOIN vzys ON prot.n_vzys=vzys.n_vzys
where prot.d_pos between "01.01.2002" and "31.01.2002"
GROUP BY sost.sost, vzys.vzys, stat.stat
Попробуй.
← →
kaif (2002-05-31 13:13) [4]Изначально неверно организована финансовая информация в таблице. Неверно использовать такие вещи, как признак оплаты. Нужно иметь два поля
1) сумма начисленная
2) сумма оплаченная
Тогда все получишь простым запросом:
SELECT
COUNT(*), SUM(<начислено>), SUM(<оплачено>), <несчастный>
FROM <таблица>
GROUP BY <несчастный>
К тому же учти, что возможны ситуации спорные, например, начислена одна сумма, а оплачена другая (по ошибке или намеренно). Тогда твой флаг "оплачено" вообще потеряет смысл.
Пока не поздно, добавь второе поле, а флаг выкинь к чертям.
Если же нужно иметь еще какие-то признаки, например,
"1-е предупреждение"
"2-е предупреждение" и т. п.
"наезд с запугиванием несчастных"
то для этого придется отдельные колонки заводить с информацией о количестве таких акций и тогда опять все будет суммироваться таким же запросом.
Хотя, по правде говоря, чем все это медленнее работать будет, тем оно лучше...:))
Страницы: 1 вся ветка
Форум: "Базы";
Текущий архив: 2002.06.24;
Скачать: [xml.tar.bz2];
Память: 0.45 MB
Время: 0.008 c