Лидеры рейтинга

ID: 226425

Konstantin Shvetski

Мастер-Эксперт

959

Россия, Северодвинск


ID: 259041

Алексеев Владимир Николаевич

Мастер-Эксперт

541

Россия, пос. Теплоозёрск, ЕАО


ID: 401284

Михаил Александров

Академик

354

Россия, Санкт-Петербург


ID: 137394

Megaloman

Мастер-Эксперт

312

Беларусь, Гомель


ID: 400669

epimkin

Профессионал

267


ID: 400484

solowey

Профессор

73


ID: 401888

puporev

Профессор

53

Россия, Пермский край


8.1.6

02.01.2021

JS: 2.2.2
CSS: 4.2.0
jQuery: 3.5.1


 

Создание программ на языках Pascal, Delphi и Lazarus.

Администратор раздела: Зенченко Константин Николаевич (Старший модератор)


Зенченко Константин Николаевич
Статус: Старший модератор
Рейтинг: 269
Gluck
Статус: 6-й класс
Рейтинг: 240
puporev
Статус: Профессор
Рейтинг: 53
 

Перейти к консультации №:
 

Консультация онлайн # 146137
Раздел: • Pascal / Delphi / Lazarus
Автор вопроса: Maximus777
Дата: 05.10.2008, 22:04
Поступило ответов: 0

Здравствуйте!
Скажите возможно ли использование этого кода в Дельфях? У меня при использовании group by вылетает ошибка. Данные выводятся в DBGrid. Может именно поэтому не получается? Реально ли вообще в DBGrid'е вывести по одному и с суммами? Или придётся перебирать все и выводить в какой-нибудь ListView?

Приложение:

Последнее редактирование 05.10.2008, 22:07 [неизвестный]

Состояние: Консультация закрыта

Oтветов пока не поступило.

Мини-форум консультации № 146137

Вадим Исаев ака sir Henry

Мастер-Эксперт

ID: 425

1

= общий = |  06.10.2008, 09:09 |  цитировать |  профиль |  личное сообщение

Maximus777
А текст ошибки кто за Вас будет писать?

=====
Я только в одном глубоко убеждён - не надо иметь убеждений! :)

неизвестный

2

= общий = |  07.10.2008, 20:58

Разобрался с кодом. Выводит, но малость не так как хотелось. Мне надо чтобы одинаковые наименования по количеству суммировались, и название выводилось только один раз. Например, был продан Анальгин 01.10.2008-1 и 05.10.2008-3, дык вот чтоб в гриде было |Анальгин | 4 |. Или это невозможно?

=====
Я только в одном глубоко убеждён - не надо иметь убеждений! :)

Вадим Исаев ака sir Henry

Мастер-Эксперт

ID: 425

3

= общий = |  08.10.2008, 06:27 |  цитировать |  профиль |  личное сообщение

Возможно:

SELECT название, SUM(количество) AS количество FROM таблица WHERE дата BETWEEN начальная_дата AND конечная_дата GROUP BY название

Это общий, так сказать, стандартный вид вид запроса для Вашего случая. В результате выводится по одному названию, количество суммируется по названию, за указанный период.

=====
Я только в одном глубоко убеждён - не надо иметь убеждений! :)

неизвестный

4

= общий = |  08.10.2008, 23:08

Спасибо. Вроде разобрался, работает. Пришлось в дельфях из ADOQuery убирать поля, тогда заработало. Теперь другой вопрос. Нигде не могу найти толкового примера с двумя JOIN. У меня названия берутся из Table1, а Приход и Расход соответственно с Table3 и Table2. Т.е. Table1 надо заJOINить с 2 и 3. С одним JOINом всё работало. Теперь надо два. Поправьте плиз код. Засада явно где-то во второй строке.

SQL.Add('select Table1.Наименование,sum(Table3.Количество) as Приход,sum(Table2.Количество) as Расход');
SQL.Add('from Table1 join Table2 join Table3 on Table1.key1=Table2.id and Table1.key1=Table3.id');
SQL.Add('where Дата between #'+FormatDateTime('mm''/''dd''/''yyyy',Date1.Date)+'# and #'+FormatDateTime('mm''/''dd''/''yyyy',Date2.Date)+'#');
SQL.Add('group by Table1.Наименование');
SQL.Add('order by Table1.Наименование');

=====
Я только в одном глубоко убеждён - не надо иметь убеждений! :)

Вадим Исаев ака sir Henry

Мастер-Эксперт

ID: 425

5

= общий = |  09.10.2008, 05:08 |  цитировать |  профиль |  личное сообщение

Обе таблицы (Приход, Расход) надо связывать со справочником, а не друг с другом:

SELECT Table1.Наименование, SUM(Table3.Количество) AS Приход,sum(Table2.Количество) AS Расход
FROM Table1
INNER JOIN Table2 ON Table1.key1=Table2.id
INNER JOIN Table3 ON Table1.key1=Table3.id

Таким образом сначала прописывается связь первой таблицы со второй и условие их связи, а потом прописывается связь с третьей таблицей и условие связи первой таблицы с третьей.

=====
Я только в одном глубоко убеждён - не надо иметь убеждений! :)

неизвестный

6

= общий = |  09.10.2008, 19:46

делаю так:

   Close; SQL.Clear;
   SQL.Add('select Table1.Наименование, sum(Table3.Количество) as Приход, sum(Table2.Количество) as Расход');
   SQL.Add('from Table1');
   SQL.Add('inner join Table2 on Table1.key1=Table2.id');
   SQL.Add('inner join Table3 on Table1.key1=Table3.id');
   SQL.Add('where Дата between #'+FormatDateTime('mm''/''dd''/''yyyy',Date1.Date)+'# and #'+FormatDateTime('mm''/''dd''/''yyyy',Date2.Date)+'#');
   SQL.Add('group by Table1.Наименование');
   SQL.Add('order by Table1.Наименование');
   Open;


Говорит "Ошибка синтаксиса, пропущен оператор".

=====
Я только в одном глубоко убеждён - не надо иметь убеждений! :)

Вадим Исаев ака sir Henry

Мастер-Эксперт

ID: 425

7

= общий = |  10.10.2008, 05:24 |  цитировать |  профиль |  личное сообщение

А почему у Вас внутри FormatDateTime(), в строке формата, стоят одинарные кавычки?

=====
Я только в одном глубоко убеждён - не надо иметь убеждений! :)

неизвестный

8

= общий = |  10.10.2008, 05:57

Могу сказать только одно, с двумя таблицами всё работает на ура, с этой же строкой про дату. Проблема возникает с JOINом, когда я третью таблицу пытаюсь привязать.

=====
Я только в одном глубоко убеждён - не надо иметь убеждений! :)

Вадим Исаев ака sir Henry

Мастер-Эксперт

ID: 425

9

= общий = |  10.10.2008, 06:51 |  цитировать |  профиль |  личное сообщение

Конструкцию, подобно Вашей, я проверил на своей БД (только она MySQL, а не Access) - работает без проблем.
А без WHERE с тремя таблицами у Вас работает?
Перед полем "Дата" название таблицы пробовали ставить? А то Дата у Вас стоит сиротинушкой, неизвестно к какой таблице относится.

=====
Я только в одном глубоко убеждён - не надо иметь убеждений! :)

неизвестный

10

= общий = |  10.10.2008, 10:19

У меня с тремя таблицами вообще не получается. Работает только с двумя. Я наверное запутал вас. Попробую объяснить суть моей задачи. Есть три таблицы:

Table1 - id, Наименование, Цена (таблица справочник наименований)
Table2 - id, Дата, количество (таблица по расходу)
Table3 - id, Дата, Количество (таблица по приходу)

И есть DBGrid, в котором надо выводить информацию за период (неделю, месяц, год) в таком виде:

Наименование | Приход | Расход

Причём за этот период приход или расход может быть и нулевым. Никак не могу сообразить что мне связать и какой запрос делать. Это мой первый опыт работы с БД.

=====
Я только в одном глубоко убеждён - не надо иметь убеждений! :)

неизвестный

11

= общий = |  10.10.2008, 13:54

Всё! Вопрос решён. Метод научного тыка сделал своё дело. Вот оно:

SELECT Table1.Наименование, Sum(Table3.Количество) AS Приход, Sum(Table2.Количество) AS Расход
FROM (Table1 LEFT JOIN Table2 ON Table1.key1 = Table2.id) LEFT JOIN Table3 ON Table1.key1 = Table3.id
WHERE (((Table3.Дата) Between #1/10/2008# And #10/31/2008#)) OR (((Table2.Дата) Between #1/10/2008# And #10/31/2008#))
GROUP BY Table1.Наименование
ORDER BY Table1.Наименование;

Я нашёл отличный вариант помощи в запросах. В конструкторе Акцесса добиваюсь работоспособности запроса, потом перевожу конструктора в режим SQL и вижу весь текст. Вуаля. Остаётся чуть-чуть подпилить для дельфей и всё. Спасибо за внимание, уделённое моему вопросу.

=====
Я только в одном глубоко убеждён - не надо иметь убеждений! :)

Вадим Исаев ака sir Henry

Мастер-Эксперт

ID: 425

12

= общий = |  11.10.2008, 04:11 |  цитировать |  профиль |  личное сообщение

Цитата:
Table3.Дата

Я ведь Вас про это спрашивал. И если бы Вы обращали внимание на мои уточняющие вопросы, то работоспособности запроса можно было бы добиться гораздо раньше.

=====
Я только в одном глубоко убеждён - не надо иметь убеждений! :)

неизвестный

13

= общий = |  11.10.2008, 08:58

А я думаю что наиболее критичное место всё-таки вторая строка. Третью строку я по всякому упрощал, но работоспособности запрос не приобретал. А вот после появления скобок и слова LEFT во второй строке всё заработало. Теперь бы ещё понять как весь процесс JOINа происходит ...

И всё-таки запрос работает не как мне надо. Мне необходимо как-то разделить Приход с Расходом. Сейчас одно из этих полей может врать. Не получается вывести за определённую дату. Подскажите где я не прав? К примеру задаём период с 05.10.2008 по 06.10.2008. Должно быть так:
Анальгин | 5 | 0
Бинт | 0 | 10

А у меня получается что если во вторую колонку попадает что-то, то автоматом и третья заполняется значением, но у этих значений (в третьем столбце) дата другая.

=====
Я только в одном глубоко убеждён - не надо иметь убеждений! :)

Вадим Исаев ака sir Henry

Мастер-Эксперт

ID: 425

14

= общий = |  11.10.2008, 17:19 |  цитировать |  профиль |  личное сообщение

Слово LEFT означает, что при объединении таблиц из левой таблицы будут взяты все записи без исключения. INNER означает, что взяты будут тольке те записи, которые удовлетворяют условию объединения (которое после ON). Соответственно слово RIGHT будет обозначать, что берутся все без исключения записи в правой таблице.
По поводу условия.
1. Вам надо чтобы в приходе и расходе id лекарства совпадало с таблицей справочника. Это у Вас выполняется в условиях объединения (JOIN).
2. Вам надо, чтобы дата и в расходе и в приходе входила в заданный диапазон. "И" по английски пишется как "AND". Посмотрите, а у Вас там в условии какое слово написано? По Вашему условию получается, что запись будет попадать если дата расхода совпадает или дата прихода совпадает.

=====
Я только в одном глубоко убеждён - не надо иметь убеждений! :)

неизвестный

15

= общий = |  11.10.2008, 18:15

Слово "И" то я знаю, с этим проблем нет, но если его использовать, то в грид вообще ничего не попадает. Потому что к примеру в периоде за 5-6 число Приход был 5-го, а Расход был 6-го. И если я делаю выборку за 5-е число, то в гриде пусто. Приход и Расход должны быть независимы друг от друга, а связаны только со справочником. Вобщем засада.

=====
Я только в одном глубоко убеждён - не надо иметь убеждений! :)

Возможность оставлять сообщения в мини-форумах консультаций доступна только после входа в систему.
Воспользуйтесь кнопкой входа вверху страницы, если Вы зарегистрированы или пройдите простую процедуру регистрации на Портале.