Главная страница
Top.Mail.Ru    Яндекс.Метрика
Текущий архив: 2004.04.25;
Скачать: CL | DM;

Вниз

суммирование данных из двух таблиц.   Найти похожие ветки 

 
HMT   (2004-03-21 14:20) [0]

Добрый день. У меня вот такая проблема
Есть две таблицы, одна из них - склад №1, вторая - склад №2, возможно-ли SQL запросом сложить одинаковые записи (включая integer поле "кол-во") с обоих таблиц и представить их в виде третей  ?

Помогите плз



1 таблица
______________________
Наименование Кол-во
Диван-130       1
Кровать-10      5

2 таблица
_______________________
Наименование Кол-во
Диван-130      4
Кровать-10     11
Кресло-150     5

Таблица которую мне очень хочется получить:

________________
Наименование Кол-во
Диван-130      5
Кровать-10     16
Кресло-150     5



Подскажи плз, как это можно сделать при помощи SQL. ?


 
KSergey ©   (2004-03-21 15:11) [1]

Я не очень знаю особенности синтаксиса SQL в IB, в MS SQL проканало бы следующее решение в лоб (не проверял, возможны описки)

SELECT Naim, Sum(KolVo)
FROM (
 SELECT Naim, KolVo FROM T1
 UNION ALL
 SELECT Naim, KolVo FROM T2
) AS T
GROUP BY Naim

Либо, наверное, что-то такое тоже должно получиться:

SELECT T1.KolVo + T2.KolVo AS KolVo
FROM T1, T2
WHERE T1.Naim = T2.Naim

В поледнем случае лучше через join, конечно, чтобы не получилось, что наименования только из одной таблицы потеряются. Там тогда еще ISNULL приплести придется...


 
byte ©   (2004-03-21 16:16) [2]

про варианты KSergey ©

SELECT ... FROM (SELECT ...) у меня лично не работает

во втором случае не выдаются названмя.

так сложнее, но вроде работает:

select name,kol from t1 where name not in (select name from t2)
union
select name,kol from t2 where name not in (select name from t1)
union
select name,t1.kol+t2.kol from t1,t2 where t1.name=t2.name

поле количества нигде не должно быть пустым


 
KSergey ©   (2004-03-21 16:22) [3]

>  [2] byte ©   (21.03.04 16:16)
> во втором случае не выдаются названмя.

Ну знаете ли, уж добавить вывод еще одного поля в SELECT - это как бы все умеют. Так я думаю, во всяком случае ;)
А иначе - звиняйте. Азы SQL рассказывать лень.


 
byte ©   (2004-03-21 16:26) [4]

KSergey ©

Я не хотел никого обидеть, а имел ввиду, что если добавить поле "название" в SELECT, то отобразятся названия только из одной таблицы.


 
KSergey ©   (2004-03-21 16:32) [5]

>  [4] byte ©   (21.03.04 16:26)
> то отобразятся названия только
> из одной таблицы.

Но ведь в приведенном запросе - они совпадают, верно? ;) Так какая разница?
Тонкость тут только тогда, когда в таблицах есть несовпадающие по названиям строки. Ну тут немного доделать надо, факт. Впрочем, я упоминал об этом.


 
byte ©   (2004-03-21 16:40) [6]

KSergey ©
Проблема в том, что если объединять две таблицы по JOIN - получатся два поля NAME и NAME_1. В одном -названия из первой таблицы, в другом - из второй.
Я сейчас попробовал - ничего хорошего не получилось.
Если покажешь работающий вариант, буду очень признателен.


 
Zacho ©   (2004-03-21 20:12) [7]

2 HMT :
Можно сделать view с union и уже из него делать запрос с суммированием.
Или в ХП можно сделать практически что угодно.
А вообще, такая структура БД говорит о неправильном проектировании. Делали бы декомпозицию проекцией, а не ограниченной выборкой (то, как сделано у вас именно так называется) - и таких проблем бы не было. Читайте Дейта !


 
Zacho ©   (2004-03-21 20:17) [8]

2 KSergey © :
Твой вариант не подходит, поскольку в IB нет SELECT FROM SELECT.
А вариант 2 не подходит, если нужно агрегирование, а не суммирование полей.
Правда, что именно нужно лучше спросит у автора ветки..


 
HMT   (2004-03-23 14:37) [9]

2Zacho

Необходимо суммировать содержимое таблиц.

Спасибо за советы. Щас буду думать и пробывать.


 
Deniz ©   (2004-03-23 14:51) [10]

Делай ХП
kolvo_tov = 0;
for select distinct name from t1, t2 into :Name do
begin
 select sum(kol_vo) from t1 where name = :Name into :tmp;
 if (not (tmp is null)) then kolvo_tov = kolvo_tov + tmp;
 select sum(kol_vo) from t2 where name = :Name into :tmp;
 if (not (tmp is null)) then kolvo_tov = kolvo_tov + tmp;
 // Name - наименование
 // kolvo_tov - сумма
 suspend;
end


 
KSergey ©   (2004-03-23 14:58) [11]

> byte ©   (21.03.04 16:40) [6]
> Проблема в том, что если объединять две таблицы по JOIN
> - получатся два поля NAME и NAME_1. В одном -названия из
> первой таблицы, в другом - из второй.

Че за фигня, извините?
Как напишем - так и будет! ;)

Для MS SQL - могу показать. Но, возможно, для IB есть какие-то тонкости.

> Zacho ©   (21.03.04 20:17) [8]
> Твой вариант не подходит, поскольку в IB нет SELECT FROM
> SELECT.

Об этом я почти знал - как-то уже читал ;)
Впрочем, "Можно сделать view с union" - та же фигня, по сути ;)
> не подходит, если нужно агрегирование, а не суммирование
> полей.

В вопросе было про суммирование ;) Я понимаю, что это не одно и тоже ;)


 
Zacho ©   (2004-03-23 15:03) [12]


> HMT   (23.03.04 14:37) [9]
> Необходимо суммировать содержимое таблиц

Всё равно не понятно. Нормально напиши, что именно тебе нужно.

А лучший вариант - перепроектировать БД.


 
Zacho ©   (2004-03-23 15:08) [13]


> KSergey ©   (23.03.04 14:58) [11]
> Впрочем, "Можно сделать view с union" - та же фигня, по
> сути ;)


Естественно :)


> В вопросе было про суммирование ;) Я понимаю, что это не
> одно и тоже ;)

Мало ли что было в вопросе :) Всё равно не понятно, что именно автору топика надо.


 
Johnmen ©   (2004-03-23 16:49) [14]

Наиболее правильное решение, как уже сказали, перепроектировать БД.
Но решить одним (сложным) запросом можно. Если FB1.5, а не IB6.0


 
HMT   (2004-03-26 11:06) [15]

Johnmen, Zacho,
..Ну я вроде описал цель того чего хотел. В общем есть два склада. Надо выводить общий остаток с обеих складов.

Johnmen, подскажи плз каким..В принципе у меня fb.


 
Johnmen ©   (2004-03-26 11:09) [16]

SELECT
 CASE WHEN A.name IS NULL THEN B.name ELSE A.name END,
 (SELECT CASE WHEN SUM(C.cnt) IS NULL THEN 0 ELSE SUM(C.cnt) END
  FROM Table1 C WHERE C.name=A.name)+
 (SELECT CASE WHEN SUM(D.cnt) IS NULL THEN 0 ELSE SUM(D.cnt) END
  FROM Table2 D WHERE D.name=B.name)
FROM Table1 A
FULL JOIN Table2 B ON B.name=A.name
GROUP BY A.name, B.name



Страницы: 1 вся ветка

Текущий архив: 2004.04.25;
Скачать: CL | DM;

Наверх




Память: 0.51 MB
Время: 0.025 c
11-1062089276
alex_s
2003-08-28 20:47
2004.04.25
expert


3-1080712258
mixam
2004-03-31 09:50
2004.04.25
приведение типов


1-1081450349
Rim
2004-04-08 22:52
2004.04.25
Help


1-1081448656
Галин А.М.
2004-04-08 22:24
2004.04.25
Как скопировать строку WideString в ClipBoard и обратно


1-1081159093
Checist [root]
2004-04-05 13:58
2004.04.25
Вытащить сылку из .lnk файла