![]() |
| ||
|
|
Новости |
Поиск |
FAQ |
Статьи |
Книги |
Новости VCL
| | Форумы ЧАТ |
Орешник |
|
| |||
| |||
« предыдущая ветвь | форум | следующая ветвь »
Как составить SQL запрос [D5, D6, MSSQL]
AndrewK © (2002-03-05 15:35:00)Здравствуйте.
Есть две таблицы
Table1
IDR int
Product_ID int
Order_ID int
Count int
и
Table2
IDR int
Product_ID int
Order_ID int
Count int
В таблицу Table1 заносится информация пользователями. Таблица используется для хранения перечней в заказе (ID записи заказа храниться в поле Order_ID). Есть главный менеджер, который должен знать какие изменения произошли в заявках за время его отсутствия. Для сохранения того, что он посмотрел использую таблицу Table2. Для этого просто переношу всю информацию из Table1 в Table2. Стоит задача сравнить две эти таблицы между собой и вывести отчет сколько продуктов было добавлено, сколько изменено, сколько удалено.
Т.е. получить примерно вот это:
Продукт Было Стало Разница
Продукт 1 0 2 2
Продукт 2 3 1 -2
Продукт 1 5 0 -5
Бьюсь над этим уже дня четыре, ничего не получается. А запрос вроде бы должен быть простым.
DPetrovich (2002-03-07 16:17:00) [1]to AndrewK © :
Думаю
select
InBuffer, InFact, (InFact-InBuffer) as Diff
from
(
select isnull(t2.Count, 0) as InBuffer,
isnull(t1.Count, 0) as InFact
from table1 t1
full join table2 t2 on t2.Order_ID = t1.Order_ID
union
select isnull(t2.Count, 0) as InBuffer,
isnull(t1.Count, 0) as InFact
from table2 t2
full join table1 t1 on t2.Order_ID = t1.Order_ID
) ResTable
должно работать, хотя я написал бы так...
(select
isnull(t2.Count, 0) as InBuffer,
isnull(t1.Count, 0) as InFact,
(isnull(t2.Count, 0) - isnull(t1.Count, 0)) as Diff
from
table1 t1
left join table2 t2 on t2.Order_ID = t1.Order_ID)
union
(select
isnull(t2.Count, 0) as InBuffer,
isnull(t1.Count, 0) as InFact,
(isnull(t2.Count, 0) - isnull(t1.Count, 0)) as Diff
from
table2 t2
left join table1 t1 on t2.Order_ID = t1.Order_ID)
MetallAdm (2002-03-07 16:05:00) [2]А Как Вам Такой Пример ??
У меня сдеся две таблички я для пробы сделал
(я не стал на конкретном примере енто делать)
t1 (Table)
t int
t2 (Table)
t int
туда запихал разные числа
declare @t1 int
declare @t2 int
SET NOCOUNT ON
declare test_cur cursor for
select a.t,b.t from t1 a,t2 b
open test_cur
fetch next from test_cur into @t1,@t2
while (@@fetch_status <> -1)
begin
if (@@fetch_status <> -2)
begin
Select @t1 as "Было" ,@t2 as "Стало " ,@t1-@t2 as "разница"
end
fetch next from test_cur into @t1,@t2
end
close test_cur
deallocate test_cur
но скорее енти данные придется заносить в какуюто табличку
а оттуда выводить
попробуй опираясь
на енто ведь, курсоры довольно удобная вещь :))
Думаю проше моно было но вот непонятно
в каих полях "Было" "Стало" "Продукт"
IDR int
Product_ID int
Order_ID int
Count int -- Или здеся сумма из которой вы хотите получить разницу ??
boogier (2002-03-07 16:01:00) [3]не мож б
AndrewK (2002-03-07 14:51:00) [4]2 boogier> Тож не работает
boogier (2002-03-07 11:14:00) [5]select * from table1 where not exists(select Order_id from table2 where table1.order_id= table2.order_id)
AndrewK (2002-03-06 19:09:00) [6]Запросы не работают.
Более менее что-то рабочее получилось что-то вроде этого. Однако и он тоже не всегда корректно работает иногда. Чувствую, что я что-то намудрил, но проще не получается.
select
InBuffer, InFact, (InFact-InBuffer) as Diff
from
(
select isnull(t2.Count, 0) as InBuffer,
isnull(t1.Count, 0) as InFact
from table1 t1
full join table2 t2 on t2.Order_ID = t1.Order_ID
union
select isnull(t2.Count, 0) as InBuffer,
isnull(t1.Count, 0) as InFact
from table2 t2
full join table1 t1 on t2.Order_ID = t1.Order_ID
) ResTable
Bachin (2002-03-05 19:36:00) [7]2Johnmen:
не совсем... скорее
SELECT B.Count,A.Count,A.Count-B.Count AS Diff
FROM Table2 B
OUTER JOIN Table1 A ON B.IDR=A.IDR
подзабыл MSSQL т проверить негде, но идея в связи NULL или 1
Johnmen (2002-03-05 15:47:00) [8]SELECT B.Count,A.Count,A.Count-B.Count AS Diff FROM Table1 A
JOIN Table2 B ON B.Order_ID=A.Order_ID
По-моему так...