Top.Mail.Ru
Мастера DELPHI, Delphi programming community Титульная страница Поиск, карта сайта Написать письмо 
| Новости | Поиск | FAQ | Статьи | Книги | Новости VCL |
| Форумы ЧАТ | Орешник | KOL и MCK |
Форумы -» Основная («Начинающим»)/ Базы / WinAPI / Компоненты / Сети / Media / Игры / Corba и COM / KOL / FreePascal / .Net / Прочее / RSDN.ORG

« предыдущая ветвь | форум | следующая ветвь »

SQL запрос к двум таблицам. [D6, MSAccess]


NewZ ©   (2007-07-20 23:24:00) 

Уважаемые Господа!!! Помогите!!!
Есть 2 таблицы:
Первая - поставки материалов на склад:
дата_поставки
наименование_материала
количество

Вторая - уход материалов со склада:
дата_ухода
наименование_материала
количество

Как SQL запросом вычислить остаток:
наименование_материала
количество


beg   (2007-07-25 11:22:00) [1]

>SS_   (24.07.07 20:23) [12]

> select a.наименование_материала, a.количество-sum(b.количество)
> as разность
> from Первая таблица a, Вторая таблица b
> where a.наименование_материала=b.наименование_материала
> group by a.наименование_материала

Access позволяет подобную группировку?


Кщд   (2007-07-25 11:19:00) [2]

MsGuns ©   (24.07.07 23:50) [13]
безусловно согласен
но, увы, не знаю ни одной компании, где бы новому сотруднику без опыта выдавали список обязательной к прочтению литературы и без этого самого ознакомления с т.н. "истоками" не подпускали бы к СУБД
оговорюсь, что вовсе не утверждаю, будто таких контор не существует
но на мой взгляд, это, скорее, исключение, правило подтверждающее


MsGuns   (2007-07-24 23:50:00) [3]

>Stanislav ©   (24.07.07 13:42) [10]
>Вобще в access есть конструктор, причем на русском языке, где это сделать без проблем.

Я бы не был столь категоричен. Вообще, мелкомягкие "волшебники" и "мастера" - мгко говоря, фуфло голимое ;)

По сабжу.
Начинать надо не с "эскюэля", а с основ построения БД, в частности с нормализации и понятия связывания таблиц. Тогда таких уродливых "чрезодноместных" проблем возникать не будет.


SS_   (2007-07-24 20:23:00) [4]

вначале немного намутил...

select a.наименование_материала, a.количество-sum(b.количество) as разность
from Первая таблица a, Вторая таблица b
where a.наименование_материала=b.наименование_материала
group by a.наименование_материала
union
select a.наименование_материала, a.количество as разность
from Первая таблица a
where a.наименование_материала not in (select b.наименование_материала
from Вторая таблица b)


SS_   (2007-07-24 20:19:00) [5]

select a.наименование_материала, sum(a.количество-b.количество) as разность
from Первая таблица a, Вторая таблица b
where a.наименование_материала=b.наименование_материала
group by a.наименование_материала
union
select a.наименование_материала, a.количество as разность
from Первая таблица a
where a.наименование_материала not in (select b.наименование_материала
from Вторая таблица b)


Stanislav   (2007-07-24 13:42:00) [6]

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


Anatoly Podgoretsky   (2007-07-21 11:38:00) [7]

У тебя еще возникнет проблема из-за отсутствия функций преобразования null -> 0 в Акцесс

SUM(t1.количество - null) даст null, а не t1.количество


Anatoly Podgoretsky   (2007-07-21 11:26:00) [8]


> JOIN если не ошибаюсь, то же самое, что и UNION.

JOIN соединяет поляиз разных таблиц
UNION объединяет строкииз разных запросов

Тебе нужен правильный JOIN - их не одно штук, Акцесс поддерживает минимум три.


sniknik   (2007-07-21 09:08:00) [9]

> JOIN если не ошибаюсь, то же самое, что и UNION.
ошибаешься, и в справке это написано.
в принципе твой запрос в [4] использует обьеденение типа join только неявное.
единственное, что тебе его надо переделать в явную форму и использовать jeft join(/right) чтобы оставить все записи в одной из таблиц.
ну и перед тем как отнять надо будет проверить на null значение и подменить но 0 (iff) т.к. операция с null даст null в сумме (значения null будут в тех местах где не совпадет условие where).

> Использую TADOConnection, две TADOTable и TADOQuery, куда и хочу поместить запрос.
уверен? с TADOTable это будет "немного" через задницу... возможно, но... зачем?
для запросов пользуйся родными для ADO компонентами (TADODataSet, TADOCommand), остальные нафиг.


NewZ   (2007-07-21 01:25:00) [10]

JOIN если не ошибаюсь, то же самое, что и UNION.

А UNION просто объеденяет два и более запросов. Но если
в таблицах есть одинаковые строки (например наименование_материала),
то в рез. таблице они дублируются, чего не должно быть!!!

База данных MSAccess. Использую TADOConnection, две TADOTable и
TADOQuery, куда и хочу поместить запрос.


Anatoly Podgoretsky   (2007-07-21 01:08:00) [11]

> NewZ  (21.07.2007 00:47:04)  [4]

Восспользуйся спрвкой по твоему серверу.
И используй JOIN если оно это поддерживает.


NewZ   (2007-07-21 00:47:00) [12]


>Anatoly Podgoretsky ©   (21.07.07 00:18) [3]

>Это его часть, которая вычисляет остаток.

Это мы и так знаем. На калькуляторе 2 + 2 складывать умеем.
А вот SQL не очень.
Там нужно условие WHERE. А что там писать???

SELECT t1.наименование_материала, SUM(t1.количество - t2.количество)
FROM t1, t2
WHERE t1.наименование_материала = t2.наимеование_материала
GROUP BY t1.наимеование_материала

Но тогда в результирующей таблице будут только те наименования,
которые есть в t2. А если в t1 есть те материалы, которые привезли,
но еще не списали.

P.S. кстати вон та часть, которая вычисляет количество (первая строка SELECT...)


Anatoly Podgoretsky   (2007-07-21 00:18:00) [13]

> NewZ  (20.07.2007 23:42:02)  [2]

Это его часть, которая вычисляет остаток.


NewZ   (2007-07-20 23:42:00) [14]

>Anatoly Podgoretsky ©   (20.07.07 23:28) [1]

t1.количество - t2.количество

А где здесь SQL???


Anatoly Podgoretsky   (2007-07-20 23:28:00) [15]

> NewZ  (20.07.2007 23:24:00)  [0]

t1.количество - t2.количество


Наверх

Титульная страница Поиск, карта сайта Написать письмо