Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей.
Здесь обсуждаются безопасность, программирование, технологии и многое другое.
Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
 |
Access Запрос на выборку суммы данных |

07.07.2008, 12:38
|
|
Познающий
Регистрация: 07.11.2006
Сообщений: 59
Провел на форуме: 180703
Репутация:
11
|
|
Access Запрос на выборку суммы данных
Всем привет!
У меня есть БД 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
Из-за чего это? Какой должен быть запрос, чтобы все нормально выбиралось?
|
|
|

07.07.2008, 13:35
|
|
Постоянный
Регистрация: 10.12.2005
Сообщений: 939
Провел на форуме: 3886281
Репутация:
929
|
|
А ну сделай просто select summa from T1, че там?
Странно как то это )
|
|
|

07.07.2008, 14:22
|
|
Познающий
Регистрация: 07.11.2006
Сообщений: 59
Провел на форуме: 180703
Репутация:
11
|
|
А ну сделай просто select summa from T1, че там?
Странно как то это )
Так оно нормально работает
Если просто сделать
SELECT SUM(T1.summa) FROM Table T1
то выводиться нормальная сумма данных, не перемноженная
если сделать
SELECT SUM(T1.summa), SUM (T2.summa)
FROM Table T1, Table T2
то сумма данных перемножается, причем коэффициент умножения зависит от кол-ва строк в таблицах и кол-ва функций SUM() вызываемых в запросе
|
|
|

07.07.2008, 14:24
|
|
Участник форума
Регистрация: 12.01.2007
Сообщений: 262
Провел на форуме: 4608122
Репутация:
874
|
|
У тебя ошибка в понимании работы базы данных
Вот посмотри что выдает твой запрос слегка изменненый вот так
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
|
|
|

07.07.2008, 14:37
|
|
Познающий
Регистрация: 07.11.2006
Сообщений: 59
Провел на форуме: 180703
Репутация:
11
|
|
Это я знаю, но дело в том, что мне нужно суммы данных в одной строке, т.е. нужно выполнить запрос без Union
|
|
|

07.07.2008, 14:44
|
|
Участник форума
Регистрация: 12.01.2007
Сообщений: 262
Провел на форуме: 4608122
Репутация:
874
|
|
Без юнион это обязательное условие, или тебе нужно именно в одной строке?
|
|
|

07.07.2008, 14:57
|
|
Познающий
Регистрация: 07.11.2006
Сообщений: 59
Провел на форуме: 180703
Репутация:
11
|
|
Да, нужно чтобы в одной строке отображались
не
40
30
80
а
40 30 80
|
|
|

07.07.2008, 15:05
|
|
Участник форума
Регистрация: 01.02.2007
Сообщений: 286
Провел на форуме: 804931
Репутация:
526
|
|
Сообщение от ZneP
Да, нужно чтобы в одной строке отображались
не
40
30
80
а
40 30 80
В качестве источника (FROM) используешь вышеприведенный запрос (с юнионами) - т.е. юзаешь пдзапрос, а потом вибираешь что тебе нужно. Все бут в одной строке, все счастливы и довольны.
|
|
|

07.07.2008, 15:14
|
|
Познающий
Регистрация: 07.11.2006
Сообщений: 59
Провел на форуме: 180703
Репутация:
11
|
|
Сначало я решил проблему след. образом:
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
Огромное Всем спасибо!!!
Последний раз редактировалось ZneP; 07.07.2008 в 15:19..
|
|
|

07.07.2008, 15:17
|
|
Участник форума
Регистрация: 01.02.2007
Сообщений: 286
Провел на форуме: 804931
Репутация:
526
|
|
Хотя то что я написал канешн извращение... можно нечто вродь такого:
Select
(SELECT SUM(T1.summa) FROM Table1 T1),
(SELECT SUM(T2.summa) FROM Table2 T2),
(SELECT SUM(T3.summa) FROM Table3 T3)
|
|
|
|
 |
|
Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
|
|
|
|