![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
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.количество