Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Умножить значения одной таблицы на другую, Умножить значения одной таблицы на другу 
:(
    Опции темы
alf138
Дата 4.1.2011, 20:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 161
Регистрация: 15.11.2009

Репутация: нет
Всего: нет



Есть таблица1.

наименование|колво
---------------------------
дет1                |1
дет2                |2

---------------------------


таблица.дет1.

нименование|колво
---------------------------
запч1              |2
запч4              |4

таблица.дет2

наименование|колво
---------------------------
запч1              |5
запч3              |5

Как умножить значения из первой таблицы на значения остальных, при том что названия таблиц известны, и сгруппировать по запч.
запч1 ----7шт
запч3-----10шт
запч4-----4шт


Это сообщение отредактировал(а) alf138 - 4.1.2011, 20:10
PM MAIL   Вверх
Akella
Дата 5.1.2011, 11:46 (ссылка) |    (голосов:1) Загрузка ... Загрузка ... Быстрая цитата Цитата


Творец
****


Профиль
Группа: Модератор
Сообщений: 18485
Регистрация: 14.5.2003
Где: Корусант

Репутация: 29
Всего: 329



а дельфи  тут при чём?
PM MAIL   Вверх
Vas
Дата 8.1.2011, 22:47 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 830
Регистрация: 29.6.2005
Где: Stavropol region

Репутация: 23
Всего: 28



Akella, у него на каждую дет. (хз наверное деталь) из таблицы 1 создана отдельная таблица. SQL там никак не катит, если структуру не поменяет, так что выбирать токи в цикле в дельфи, и то не факт что получится.


--------------------
И опыт, сын ошибок трудных, И гений, парадоксов друг, И случай, бог изобретатель. ... (А.С. Пушкин)
PM MAIL   Вверх
Keeper89
Дата 9.1.2011, 04:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2580
Регистрация: 26.2.2009

Репутация: 1
Всего: 58



Срочно реструктурировать таблицы и сделать всего 1 запрос.


--------------------
PM MAIL WWW   Вверх
Deniz
Дата 11.1.2011, 06:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 8
Всего: 44



Цитата(alf138 @  4.1.2011,  22:07 Найти цитируемый пост)
запч1 ----7шт
запч3-----10шт
запч4-----4шт
а результат для запч1 точно правильный?


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
Vas
Дата 12.1.2011, 08:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 830
Регистрация: 29.6.2005
Где: Stavropol region

Репутация: 23
Всего: 28



Deniz, для запч1 как раз таки правильный, а вот для запч3 должно быть 5, исходя из приведенных таблиц.
Видимо единственный выход, бежать по всем таблицам, строить список запчастей и суммировать к существующей, если она уже есть в списке, а если нет, то добавлять новую запись, со значением. Можно два массива использовать, а можно и StringList с записью вида: Имя переменной = Значение

P.S. Прям СУБД получится  smile 

Это сообщение отредактировал(а) Vas - 12.1.2011, 08:22


--------------------
И опыт, сын ошибок трудных, И гений, парадоксов друг, И случай, бог изобретатель. ... (А.С. Пушкин)
PM MAIL   Вверх
Deniz
Дата 12.1.2011, 09:38 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 8
Всего: 44



Цитата(Vas @  12.1.2011,  10:21 Найти цитируемый пост)
Deniz, для запч1 как раз таки правильный, а вот для запч3 должно быть 5, исходя из приведенных таблиц.
Если я правильно понял автора, то:
Дет1 кол-во 1, в нее входят:
запч1 | 2
запч4 | 4
Дет2 кол-во 2, в нее входят:
запч1 | 5
запч3 | 5
Итого имеем:
запч1: в дет1 - 2 шт, в дет2 - 2х5 шт (т.к. дет2 у нас 2 шт) = 12 шт
В общем филармония какая-то.


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
Vas
Дата 12.1.2011, 10:13 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 830
Регистрация: 29.6.2005
Где: Stavropol region

Репутация: 23
Всего: 28



Мда, и правда черти что  smile 


--------------------
И опыт, сын ошибок трудных, И гений, парадоксов друг, И случай, бог изобретатель. ... (А.С. Пушкин)
PM MAIL   Вверх
drkot
Дата 13.1.2011, 18:14 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
***


Профиль
Группа: Завсегдатай
Сообщений: 1042
Регистрация: 5.5.2006

Репутация: нет
Всего: 8



В данном случае решение достигается исключительно на SQL...
Примерная схема такова:
- создаем временную таблицу
- делаем умножение таблицы1 на таблица.дет1. и результат сохраняем во временной таблице
- делаем теже действия для других таблиц
- производим выборку из временной таблицы суммируя по полю количество и группируя но названию

все это можно реализовать в виде хранимой процедуры,
либо серией запросов из делфей (это уже как будет удобно)

PS: но идеально изменить структуру хранения данных это упростит дальнейшие манипуляции.




--------------------
Ошибка не становится истиной по причине широкого распространения,
как и Истина не становится Ошибкой из-за того, что никто её не видит.
PM   Вверх
alf138
Дата 13.1.2011, 23:44 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 161
Регистрация: 15.11.2009

Репутация: нет
Всего: нет



Все спасибо разобрался с умножение и группировкой получилось что то такое
Код

DataModule1.SQL_QUERY.SQL.Text:='Select  Наименования.Деталь, sum(Наименования.Колво*Количество) as Сумма FROM Телев';
DataModule1.SQL_QUERY.SQL.Add('INNER JOIN Наименования ON Телев.Наименование = Наименования.id_наимен_телев');
DataModule1.SQL_QUERY.SQL.Add('WHERE (Дата=:data1)and (Поставщик=:post)');
DataModule1.SQL_QUERY.Parameters.ParamByName('data1').Value:=ComboBox1.Text;
DataModule1.SQL_QUERY.Parameters.ParamByName('post').Value:=DBLookupComboBox1.KeyValue;
DataModule1.SQL_QUERY.SQL.Add('GROUP BY Наименования.Деталь');
DataModule1.SQL_QUERY.Open;
end;

Теперь выводятся значения сгруппированные но в виде 
2  6
3  7
и есть база где эти 2 и 3 расшифровывается как
2-дет2
3-дет4 
Вот думал сделать вторым Join но второй Join не пошел
Код

INNER JOIN Детали ON Наименвоания.Деталь=Деталь.Id

Вторая мысль родилась с помощью lookup поля, но QUERY так не сделаешь, при создание поля он ругается на отсутствие поля из которого берутся значения, вот и думаю как быть. Может кто что подскажет ?
З.Ы Даже пробовал так, но не получилось.

Это сообщение отредактировал(а) alf138 - 13.1.2011, 23:46
PM MAIL   Вверх
drkot
Дата 14.1.2011, 03:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Ищущий
***


Профиль
Группа: Завсегдатай
Сообщений: 1042
Регистрация: 5.5.2006

Репутация: нет
Всего: 8



Цитата(alf138 @  13.1.2011,  23:44 Найти цитируемый пост)
Вторая мысль родилась с помощью lookup поля, но QUERY так не сделаешь

вложенный SELECT


--------------------
Ошибка не становится истиной по причине широкого распространения,
как и Истина не становится Ошибкой из-за того, что никто её не видит.
PM   Вверх
Deniz
Дата 14.1.2011, 06:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1251
Регистрация: 16.10.2004
Где: Новый Уренгой

Репутация: 8
Всего: 44



Цитата(drkot @  14.1.2011,  05:49 Найти цитируемый пост)
вложенный SELECT 
зачем? Второго join'а хватит.
А вот почему 
Цитата(alf138 @  14.1.2011,  01:44 Найти цитируемый пост)
но второй Join не пошел
нужно спросить у автора, как он писал этот join.


--------------------
"Для того чтобы сделать шаг вперед, достаточно пинка сзади" (с)
PM ICQ   Вверх
alf138
Дата 14.1.2011, 10:21 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 161
Регистрация: 15.11.2009

Репутация: нет
Всего: нет



вот так запрос отрабатывает 
Код

Select  Наименования.Деталь, sum(Наименования.Колво*Количество) as Сумма FROM Телев
INNER JOIN Наименования ON Телев.Наименование = Наименования.id_наимен_телев
WHERE (Дата=:data1)and (Поставщик=:post)
GROUP BY Наименования.Деталь

получается таблица 
деталь|сумма
4              7
5              9
если добавляю join вот так
Код

Select  Наименования.Деталь, sum(Наименования.Колво*Количество) as Сумма FROM Телев
INNER JOIN Наименования ON Телев.Наименование = Наименования.id_наимен_телев
WHERE (Дата=:data1)and (Поставщик=:post)
GROUP BY Наименования.Деталь
INNER JOIN Детали ON Наименования.Деталь=Детали.Id

ругается "Ошибка синтаксиса (пропущен оператор)в выражение запроса Наименования.Деталь"

Это сообщение отредактировал(а) alf138 - 14.1.2011, 10:23
PM MAIL   Вверх
CROTishka
Дата 14.1.2011, 10:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 192
Регистрация: 30.7.2009

Репутация: 1
Всего: 2



Цитата(Vas @  8.1.2011,  22:47 Найти цитируемый пост)
Akella, у него на каждую дет. (хз наверное деталь) из таблицы 1 создана отдельная таблица. SQL там никак не катит, если структуру не поменяет, так что выбирать токи в цикле в дельфи, и то не факт что получится. 

А как же динамика? в любом из современных диалектов скуля такой запрос написать не сложно.
Хотя вообще за такую архитектуру ссаными тряпками надо...

Это сообщение отредактировал(а) CROTishka - 14.1.2011, 10:38
PM MAIL   Вверх
Frees
Дата 14.1.2011, 10:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 2233
Регистрация: 2.12.2005
Где: Екатеринбург

Репутация: 23
Всего: 54



Код

SELECT S.наименование,
       SUM(S.колво)
FROM (SELECT A1.наименование,
             A1.колво
      FROM дет1 A1
      UNION ALL
      SELECT A2.наименование,
             A2.колво
      FROM дет2 A2) S
group by
    S.наименование

 ??

Добавлено @ 10:47
или как то так

Код

SELECT S.наименование,
       SUM(S.колво * T.колво)
FROM (SELECT A1.наименование,
             A1.колво,
             'дет1' DET
      FROM дет1 A1
      UNION ALL
      SELECT A2.наименование,
             A2.колво,
             'дет2' DET
      FROM дет1 A2) S
    JOIN  таблица1 T ON T.наименование = S.DET
GROUP BY
    S.наименование



Это сообщение отредактировал(а) Frees - 14.1.2011, 10:48


--------------------
Кольцов Виктор Владимирович
PM MAIL ICQ   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Delphi: Базы данных и репортинг"
Vit
Петрович

Запрещено:

1. Публиковать ссылки на вскрытые компоненты

2. Обсуждать взлом компонентов и делиться вскрытыми компонентами


Обязательно указание:

1. Базы данных (Paradox, Oracle и т.п.)

2. Способа доступа (ADO, BDE и т.д.)


  • Литературу по Дельфи обсуждаем здесь
  • Действия модераторов можно обсудить здесь
  • С просьбами о написании курсовой, реферата и т.п. обращаться сюда
  • Вопросы по реализации алгоритмов рассматриваются здесь
  • 90% ответов на свои вопросы можно найти в DRKB (Delphi Russian Knowledge Base) - крупнейшем в рунете сборнике материалов по Дельфи
  • Вопросы по SQL и вопросы по базам данных не связанные с Дельфи задавать здесь

FAQ раздела лежит здесь!


Если Вам помогли и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, Vit, Петрович.

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Delphi: Базы данных и репортинг | Следующая тема »


 




[ Время генерации скрипта: 0.0640 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.