Главная страница
    Top.Mail.Ru    Яндекс.Метрика
Форум: "Базы";
Текущий архив: 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.49 MB
Время: 0.029 c
9-1067508215
Mat
2003-10-30 13:03
2004.04.25
События onMouseMove (Down, Up) у спрайтов (DelphiX)


14-1081173877
}|{yk
2004-04-05 18:04
2004.04.25
Дейкстра Структурное програмирование


1-1081162182
Layner
2004-04-05 14:49
2004.04.25
Мастера! Можно ли стандартные хинты сделать вечными?


8-1068846700
BlaMyr
2003-11-15 00:51
2004.04.25
Миниатюры графических файлов.


11-1063797669
Vadim S
2003-09-17 15:21
2004.04.25
Application.





Afrikaans Albanian Arabic Armenian Azerbaijani Basque Belarusian Bulgarian Catalan Chinese (Simplified) Chinese (Traditional) Croatian Czech Danish Dutch English Estonian Filipino Finnish French
Galician Georgian German Greek Haitian Creole Hebrew Hindi Hungarian Icelandic Indonesian Irish Italian Japanese Korean Latvian Lithuanian Macedonian Malay Maltese Norwegian
Persian Polish Portuguese Romanian Russian Serbian Slovak Slovenian Spanish Swahili Swedish Thai Turkish Ukrainian Urdu Vietnamese Welsh Yiddish Bengali Bosnian
Cebuano Esperanto Gujarati Hausa Hmong Igbo Javanese Kannada Khmer Lao Latin Maori Marathi Mongolian Nepali Punjabi Somali Tamil Telugu Yoruba
Zulu
Английский Французский Немецкий Итальянский Португальский Русский Испанский