Форум: "Базы";
Текущий архив: 2004.04.25;
Скачать: [xml.tar.bz2];
Внизсуммирование данных из двух таблиц. Найти похожие ветки
← →
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;
Скачать: [xml.tar.bz2];
Память: 0.48 MB
Время: 0.042 c