PDA

Просмотр полной версии : Access Запрос на выборку суммы данных


ZneP
07.07.2008, 12:38
Всем привет!

У меня есть БД 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


Из-за чего это? Какой должен быть запрос, чтобы все нормально выбиралось?

spider-intruder
07.07.2008, 13:35
А ну сделай просто select summa from T1, че там?
Странно как то это )

ZneP
07.07.2008, 14:22
А ну сделай просто select summa from T1, че там?
Странно как то это )
Так оно нормально работает

Если просто сделать
SELECT SUM(T1.summa) FROM Table T1
то выводиться нормальная сумма данных, не перемноженная


если сделать
SELECT SUM(T1.summa), SUM (T2.summa)
FROM Table T1, Table T2
то сумма данных перемножается, причем коэффициент умножения зависит от кол-ва строк в таблицах и кол-ва функций SUM() вызываемых в запросе

Red_Red1
07.07.2008, 14:24
У тебя ошибка в понимании работы базы данных
Вот посмотри что выдает твой запрос слегка изменненый вот так
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

ZneP
07.07.2008, 14:37
Это я знаю, но дело в том, что мне нужно суммы данных в одной строке, т.е. нужно выполнить запрос без Union

Red_Red1
07.07.2008, 14:44
Без юнион это обязательное условие, или тебе нужно именно в одной строке?

ZneP
07.07.2008, 14:57
Да, нужно чтобы в одной строке отображались

не
40
30
80

а
40 30 80

VDShark
07.07.2008, 15:05
Да, нужно чтобы в одной строке отображались

не
40
30
80

а
40 30 80
В качестве источника (FROM) используешь вышеприведенный запрос (с юнионами) - т.е. юзаешь пдзапрос, а потом вибираешь что тебе нужно. Все бут в одной строке, все счастливы и довольны.

ZneP
07.07.2008, 15:14
Сначало я решил проблему след. образом:
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


Огромное Всем спасибо!!!

VDShark
07.07.2008, 15:17
Хотя то что я написал канешн извращение... можно нечто вродь такого:

Select
(SELECT SUM(T1.summa) FROM Table1 T1),
(SELECT SUM(T2.summa) FROM Table2 T2),
(SELECT SUM(T3.summa) FROM Table3 T3)