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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 07.09.2009, 08:49   #1
sezam
 
Регистрация: 27.06.2008
Сообщений: 5
По умолчанию Формирование SQL-запроса и вывод в DBGridEh

Приветствую.
Столкнулся с проблемой при формировании SQL-запроса.

Есть вот такой запрос:

Код:
SELECT DISTINCT Кафедра_полн, ФИО, Степень, Должность, Расчет.id, 

(SELECT SUM(Лекции) FROM Выполнение      WHERE Расчет_id = Расчет.id and Период = '01.09 - 20.09') AS ['0109 @ 2009'], 

(SELECT SUM(Лекции) FROM Выполнение      WHERE Расчет_id = Расчет.id and Период = '21.09 - 20.10') AS [2109 @ 2010], 

(SELECT SUM(Лекции) FROM Выполнение      WHERE Расчет_id = Расчет.id and Период = '21.10 - 20.11') AS [2110 @ 2011], 

(SELECT SUM(Лекции) FROM Выполнение      WHERE Расчет_id = Расчет.id and Период = '21.11 - 20.12') AS [2111 @ 2012], 

(SELECT SUM(Лекции) FROM Выполнение      WHERE Расчет_id = Расчет.id and Период = '21.12 - 20.01') AS [2112 @ 2001], 

(SELECT SUM(Лекции) FROM Выполнение      WHERE Расчет_id = Расчет.id and Период = '21.01 - 07.02') AS [2101 @ 0702], 

(SELECT SUM(Лекции) FROM Выполнение      WHERE Расчет_id = Расчет.id  and Период = '01.09 - 20.09'  and Период = '21.09 - 20.10') AS [Итог 1], 

(SELECT SUM(Лекции) FROM Выполнение        WHERE Расчет_id = Расчет.id and Период = '08.02 - 20.02') AS [0802 @ 2002], 

(SELECT SUM(Лекции) FROM Выполнение      WHERE Расчет_id = Расчет.id and Период = '21.02 - 20.03') AS [2102 @ 2003], 

(SELECT SUM(Лекции) FROM Выполнение      WHERE Расчет_id = Расчет.id and Период = '21.03 - 20.04') AS [2103 @ 2004], 

(SELECT SUM(Лекции) FROM Выполнение      WHERE Расчет_id = Расчет.id and Период = '21.04 - 20.05') AS [2104 @ 2005], 

(SELECT SUM(Лекции) FROM Выполнение      WHERE Расчет_id = Расчет.id and Период = '21.05 - 20.06') AS [2105 @ 2006], 

(SELECT SUM(Лекции) FROM Выполнение      WHERE Расчет_id = Расчет.id and Период = '21.06 - 20.07') AS [2106 @ 2007]

FROM ((Кафедра INNER JOIN Преподаватель ON Преподаватель.Кафедра_id=Кафедра.id) INNER JOIN Расчет ON Расчет.Преподаватель_id=Преподаватель.id) INNER JOIN Выполнение ON Выполнение.Расчет_id=Расчет.id;


Запрос работает нормально.
Вопросов два:
1. В связи с тем, что результат запроса с участием DISTINCT и Расчет.id, выдаёт несколько строк с одинаковым ФИО но разными Расчет.id. У каждого Расчет.id - свои данные, которые суммируются и выводятся по нужному периоду. Нужно вывести таблицу так, чтобы ФИО было одно, а суммирование выполнялось по всем Расчет.id, которые содержиться с требуемым ФИО.

Используемые таблицы:

Выполнение
-----------
id, Расчет_id, Период, Лекции

Расчет
-----------
id, Преподаватель_id, Лекции

Преподаватель
--------------
id, Кафедра_id, ФИО, Степень, Должность

Кафедра
--------
id, Кафедра_полн

И второй вопрос:

В этом коде есть строчка:


Код:
(SELECT SUM(Лекции) FROM Выполнение      WHERE Расчет_id = Расчет.id and Период = '01.09 - 20.09'  and Период = '21.09 - 20.10') AS [Итог 1],

Пытаюсь вывести итог предыдущих сумм по периодам, т.е. в таблице сначала выводится некоторый отчётный период с разбивкой на периоды (в них выводятся соответствующие суммы требуемого периода), а следом идёт колонка с общим итогом за все периоды. Далее снова идёт второй отчётный период и его сумма. Заканчивается строка выводом итога за весь отчётный год.

Был бы Oracl, то в нём немного проще, т.к. можно писать циклы с поддержкой переменных вплоть до написания готовой программы на SQL, типа BEGIN ... END.

А так, приходится использовать обычный SQL.

Ещё был вариант вывести два DBGridEh. В первом выводить только ФИО, а во втором - всё остальное.

В общем, итоговая строка должна быть такой:

ФИО, Степень, Пер1, Пер2, Пер3, Итог1, Пер4, Пер5, Пер6, Итог2, ИтогОбщ
Пупкин, к.ю.н., 12, 3, 7, 22, 4, 1, 0, 5, 27

Прошу помощи!
sezam вне форума Ответить с цитированием
Старый 16.09.2009, 11:23   #2
Близнец
Новичок
Джуниор
 
Регистрация: 16.09.2009
Сообщений: 1
По умолчанию

А какая СУБД?

1. Надо группировку по ФИО. Думаю так должно получиться:

Код:
SELECT Кафедра.Кафедра_полн, Преподаватель.ФИО AS ФИО, Преподаватель.Степень, Преподаватель.Должность, Выполнение.Расчет.id, SUM(Выполнение.Лекции) as лекции, Выполнение.Период AS Период
FROM Кафедра, Преподаватель, Расчет, Выполнение  
WHERE
Преподаватель.Кафедра_id=Кафедра.id AND Расчет.Преподаватель_id=Преподаватель.id AND Выполнение.Расчет_id=Расчет.id
GROUP BY ФИО, Период
только периоды будут не в строчку а в столбец
а для твоего варианта где-то так, наверное:

Код:
SELECT DISTINCT Кафедра_полн, ФИО, Степень, Должность, Расчет.id, 

SUM(SELECT SUM(Лекции) FROM Выполнение      WHERE Расчет_id = Расчет.id and Период = '01.09 - 20.09')) AS ['0109 @ 2009'],
...

FROM ...
GROUP BY ФИО
2. Скорее всего надо так:
Код:
(SELECT SUM(Лекции) FROM Выполнение      WHERE Расчет_id = Расчет.id and (Период = '01.09 - 20.09'  OR Период = '21.09 - 20.10')) AS [Итог 1]
Близнец вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Формирование запроса по данным, взятым из формы kaizer131 Microsoft Office Access 5 07.04.2009 15:15
Формирование запроса BlackOmen JavaScript, Ajax 6 15.06.2008 12:37
Формирование запроса с параметром student_63 БД в Delphi 7 13.05.2008 17:40
Формирование НТТР-запроса в одну строку xPrizrak Работа с сетью в Delphi 5 17.10.2007 11:07