Всем привет! У меня есть БД Access, в которой есть 3 табилцы. Поля в этих таблицах одинаковые и их всего 2: id summa Вопрос в следующем. Когда я выполняю след. запрос: SELECT SUM(T1.summa), SUM(T2.summa), SUM(T3.summa) FROM Table1 T1, Table2 T2, Table3 T3 то вместо нормального отображения суммы данных отображается преумноженная в несколько раз сумма, то есть если были данные Table1: id=1, summa = 20 id=2, summa = 20 Table2: id=1, summa = 15 id=2, summa = 15 Table 3: id=1, summa = 40 id=2, summa = 40 то после выполнения запроса выводятся: SUM(T1.summa) = 160 SUM(T2.summa) = 120 SUM(T3.summa) = 320 Из-за чего это? Какой должен быть запрос, чтобы все нормально выбиралось?
Так оно нормально работает Если просто сделать SELECT SUM(T1.summa) FROM Table T1 то выводиться нормальная сумма данных, не перемноженная если сделать SELECT SUM(T1.summa), SUM (T2.summa) FROM Table T1, Table T2 то сумма данных перемножается, причем коэффициент умножения зависит от кол-ва строк в таблицах и кол-ва функций SUM() вызываемых в запросе
У тебя ошибка в понимании работы базы данных Вот посмотри что выдает твой запрос слегка изменненый вот так SELECT * FROM Table1 T1, Table2 T2, Table3 T3 или вот так SELECT T1.summa, T2.summa, T3.summa FROM Table1 T1, Table2 T2, Table3 T3 При таком запросе получается полное произведение трех таблиц, т.е. в результате каждый елемент одной таблицы стыкуется с каждым другим и так все комбинации. Ведь то что идет после ключевого слова SELECT это всего лишь то что ты хочешь отобразить из результирующего набора, а вот сам запрос это то что идет после FROM учитывая при этом еще и WHERE если есть(хз как точнее пояснить ) Именно так работает база. Так вот при запросе SELECT T1.summa, T2.summa, T3.summa FROM Table1 T1, Table2 T2, Table3 T3 у тебя выйдет не то что ты ожидаешь (как я понял) sumaaa sumaaa sumaaa 20 15 40 20 15 40 у тебя получится все комбинации этих чисел sumaaa sumaaa sumaaa 20 15 40 20 15 40 20 15 40 20 15 40 20 15 40 20 15 40 20 15 40 20 15 40 Вот оно и находит сумму этого набора Что бы этого не было нужно сделать три запроса так как сказал spider-intruder (ну ясное дело что выводи сумму, а не значение столбика), т.е. SELECT SUM(T1.summa) FROM Table1 T1 SELECT SUM(T2.summa) FROM Table1 T2 SELECT SUM(T3.summa) FROM Table1 T3 Можно еще Юнион сделать вот так SELECT SUM(test.sumaaa) FROM `test` UNION SELECT SUM(test1.sumaaa) FROM `test1` UNION SELECT SUM(test2.sumaaa) FROM `test2` результат SUM(test.sumaaa) 40 30 80
Это я знаю, но дело в том, что мне нужно суммы данных в одной строке, т.е. нужно выполнить запрос без Union
В качестве источника (FROM) используешь вышеприведенный запрос (с юнионами) - т.е. юзаешь пдзапрос, а потом вибираешь что тебе нужно. Все бут в одной строке, все счастливы и довольны.
Сначало я решил проблему след. образом: SELECT SUM(Table1.summa)/COUNT(Table1.summa)*(SELECT COUNT(Table1.summa) FROM Table1), SUM(Table2.summa)/COUNT(Table2.summa)*(SELECT COUNT(Table2.summa) FROM Table2), SUM(Table3.summa)/COUNT(Table3.summa)*(SELECT COUNT(Table3.summa) FROM Table3) FROM Table1, Table2, Table3 Теперь решение такое: SELECT SUM(t1.summa), (SELECT SUM(t2.summa) FROM Table2 t2), (SELECT SUM(t3.summa) FROM Table3 t3) FROM Table1 t1 Огромное Всем спасибо!!!
Хотя то что я написал канешн извращение... можно нечто вродь такого: Select (SELECT SUM(T1.summa) FROM Table1 T1), (SELECT SUM(T2.summa) FROM Table2 T2), (SELECT SUM(T3.summa) FROM Table3 T3)