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

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

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

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

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

Ответ
 
Опции темы Поиск в этой теме
Старый 13.05.2014, 00:02   #1
kkasady
Пользователь
 
Регистрация: 12.05.2014
Сообщений: 14
По умолчанию вычислить сумму по полям

вопрос такой: на какую сумму поставил товаров каждый продавец.

таблица 1 - н, наме (NM), прайс (PRC)
таблица 2 - н, н1, дата, кол-во (QNT), н2 (н=:н из табл 1)
таблица 3 - н, поставщик (SUPS) (н=:н2)

по сути, нужно сгруппировать по поставщикам и перемножить цену на количество:

Код:
Query4.Close;
Query4.SQL.Clear;
Query4.SQL.Add('SELECT db33.N, db33.SUPS, SUM (db22.QNT*db11.PRC) as SUMSUPS');
Query4.SQL.Add('FROM db33 LEFT JOIN db22 ON db22.N2=db33.N');
Query4.SQL.Add('GROUP BY db33.N, db33.SUPS');
Query4.Open;
ошибка: инвалид филд наме: PRC. все понятно, не подключена табл 1, где собственно и находится цена.

добавляю в FROM db11, т.е получается:

Код:
Query4.Close;
Query4.SQL.Clear;
Query4.SQL.Add('SELECT db33.N, db33.SUPS, SUM (db22.QNT*db11.PRC) as SUMSUPS');
Query4.SQL.Add('FROM db11, db33 LEFT JOIN db22 ON db22.N2=db33.N');
Query4.SQL.Add('GROUP BY db33.N, db33.SUPS');
Query4.Open;
все считается, но получаются не те суммы, какие должны быть.

может db11 как-то по другому подключить?
kkasady вне форума Ответить с цитированием
Старый 13.05.2014, 08:42   #2
Vapaamies
Ваш К. О.
Участник клуба
 
Аватар для Vapaamies
 
Регистрация: 26.12.2012
Сообщений: 1,774
По умолчанию

Цитата:
Сообщение от kkasady Посмотреть сообщение
может db11 как-то по другому подключить?
Естественно. Нужно именно подключить отдельным join, а не перемножить.
Vapaamies вне форума Ответить с цитированием
Старый 13.05.2014, 09:08   #3
kkasady
Пользователь
 
Регистрация: 12.05.2014
Сообщений: 14
По умолчанию

Код:
Query4.SQL.Add('SELECT db33.N, db33.SUPS, SUM (db22.QNT*db11.PRC) as SUMSUPS');
Query4.SQL.Add('FROM db33');
Query4.SQL.Add('LEFT JOIN db11 ON db11.N=db33.N');
Query4.SQL.Add('LEFT JOIN db22 ON db22.N2=db33.N');
Query4.SQL.Add('GROUP BY db33.N, db33.SUPS');
Query4.Open;
сделал так.
все равно суммы не те считает, точнее где-то правильно, а где-то нет.
kkasady вне форума Ответить с цитированием
Старый 13.05.2014, 09:30   #4
Аватар
Старожил
 
Аватар для Аватар
 
Регистрация: 17.11.2010
Сообщений: 18,922
По умолчанию

Сначала структуру внятно распишите, по приведенной шпаргалке больше вопросов, чем возможных ответов
Если бы архитекторы строили здания так, как программисты пишут программы, то первый залетевший дятел разрушил бы цивилизацию
Аватар вне форума Ответить с цитированием
Старый 13.05.2014, 09:48   #5
kkasady
Пользователь
 
Регистрация: 12.05.2014
Сообщений: 14
По умолчанию

таблица 1 (главная) - N (тип + ключ *), NM (название товара), PRC (цена)
таблица 2 (соединена с табл 1, N=:N) - N (I *), N1 (+ *), DT (дата поставки), QNT (количество), N2 (номер поставщика)
таблица 3 (соединена с табл 2, N=:N2) - N (+ *), SUPS (поставщик)

СУБД - парадокс
kkasady вне форума Ответить с цитированием
Старый 13.05.2014, 11:48   #6
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Цитата:
таблица 1 (главная) - N (тип + ключ *), NM (название товара), PRC (цена)
таблица 2 (соединена с табл 1, N=:N) - N (I *), N1 (+ *), DT (дата поставки), QNT (количество), N2 (номер поставщика)
таблица 3 (соединена с табл 2, N=:N2) - N (+ *), SUPS (поставщик)
таблица 1 (товары) - N (тип + ключ *), NM (название товара), PRC (цена)
таблица 2 (поставки) N (номер товара), N1 (+ *), DT (дата поставки), QNT (количество), N2 (номер поставщика)
таблица 3 (поставщики) N (+ *), SUPS (поставщик)
Цитата:
Query4.SQL.Add('SELECT db33.N, db33.SUPS, SUM (db22.QNT*db11.PRC) as SUMSUPS');
Query4.SQL.Add('FROM db33');
Query4.SQL.Add('LEFT JOIN db11 ON db11.N=db33.N');
Query4.SQL.Add('LEFT JOIN db22 ON db22.N2=db33.N');
Query4.SQL.Add('GROUP BY db33.N, db33.SUPS');
Код:
SELECT db33.N, db33.SUPS, SUM (db22.QNT*db11.PRC) as SUMSUPS
FROM db33 --берем (2) поставщщиков
LEFT JOIN db11 ON db11.N=db33.N --присоединяем (1) товары (код товара = кодпоставщика)??
LEFT JOIN db22 ON db22.N2=db33.N --присоединяем (2) поставки (код поставщика =код поставщика )
GROUP BY db33.N, db33.SUPS
программа — запись алгоритма на языке понятном транслятору
evg_m вне форума Ответить с цитированием
Старый 13.05.2014, 13:23   #7
kkasady
Пользователь
 
Регистрация: 12.05.2014
Сообщений: 14
По умолчанию

понятно, т.е. должно быть так:
LEFT JOIN db11 ON db11.N=db22.N (номер товара=номер товара)

но тогда ошибка выскакивает - инвалид филд наме: N.
kkasady вне форума Ответить с цитированием
Старый 13.05.2014, 15:51   #8
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

Код:
SELECT db33.N, db33.SUPS, SUM (db22.QNT*db11.PRC) as SUMSUPS
FROM db33 --берем (3) поставщщиков
LEFT JOIN db22 ON db22.N2=db33.N --присоединяем (2) поставки 
LEFT JOIN db11 ON db11.N=db22.N --присоединяем (1) товары 
GROUP BY db33.N, db33.SUPS
если поддержаны вложенные запросы, можно
Код:
select t3.sups, itg.sums
from t3 -поставщики
left join ( select t2.N, sum(t2.qnt, t1.prc) as sums
               from t2 -поставки
               left join t1 on t1.N =t2.N -товары (чтобы узнать цену)
               group by t2.N --расчет суммы по поставщикам
            ) as sums on sums.N =t3.N
хранить цену оптимальнее в таблице поставки (вместе с количеством). Один и тот же товар может быть поставлен по РАЗНЫМ ценам.
Хлеб столичный от Ивана в 2010 г. 10р.
Хлеб столичный от Петра в 2012 г. 10.05р
Хлеб столичный от Ивана в 2014 г. 11.45р.
Или это будет уже другой товар?
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 13.05.2014 в 15:57.
evg_m вне форума Ответить с цитированием
Старый 13.05.2014, 21:10   #9
kkasady
Пользователь
 
Регистрация: 12.05.2014
Сообщений: 14
По умолчанию

немного не по теме:
решил сменить paradox на access.

создал таблицы, подключил их с помощью ADOConnection, ADOQuery, DataSource, DBGrid.
в итоге получилось:
таблица 1 - adocon1, adoque1, ds1, dg1
таблица 2 - adocon2, adoque2, ds2, dg2
таблица 3 - adocon3, adoque3, ds3, dg3

теперь хочу вывести запрос в DBGrid4.
в парадоксе я просто создавал новые Query4, DataSource4, DBGrid4, писал запрос: Query4.SQL.Add('SELECT ...'); и все нормально выводилось.

как подобное реализовать с помощью ADOCOnnection и ADOQuery?
kkasady вне форума Ответить с цитированием
Старый 14.05.2014, 09:55   #10
evg_m
Старожил
 
Регистрация: 20.04.2008
Сообщений: 5,526
По умолчанию

на общей форме (главная) ставим ADOConnection и настраиваем.
Код:
ConnectionString:=...........
вместо гл.формы можно использовать DataModule.

ВСЕ ADOQuery подключаем к этому ADOConection.
Код:
ADOQuery.Connection:=Form1.Adoconnection; 
ADOQuery.Connection:=DataModulle1.Adoconnection;
Это можно сделать и в ObjectInspector
Далее как обычно (Datasource DBgrid )
Цитата:
новые (ADO)Query4, DataSource4, DBGrid4, писал запрос: Query4.SQL.Add('SELECT ...');
программа — запись алгоритма на языке понятном транслятору

Последний раз редактировалось evg_m; 14.05.2014 в 09:58.
evg_m вне форума Ответить с цитированием
Ответ


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



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
Вычислить сумму (СИ) GroMkiY Помощь студентам 4 16.10.2013 19:46
Три задачи - Найти сумму натуральных чисел; Протабулировать функцию; вычислить сумму kolya1114 Паскаль, Turbo Pascal, PascalABC.NET 3 01.12.2012 19:01
Вычислить сумму rapprozi Помощь студентам 1 11.05.2012 23:30
Вычислить сумму lady.ulumba Помощь студентам 4 16.10.2011 18:38
Вычислить сумму Balda1111 Паскаль, Turbo Pascal, PascalABC.NET 2 12.04.2011 13:36