ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2
Antichat снова доступен.
Форум Antichat (Античат) возвращается и снова открыт для пользователей. Здесь обсуждаются безопасность, программирование, технологии и многое другое. Сообщество снова собирается вместе.
Новый адрес: forum.antichat.xyz
Вернуться   Форум АНТИЧАТ > Программирование > PHP, PERL, MySQL, JavaScript
   
Ответ
 
Опции темы Поиск в этой теме Опции просмотра

Access Запрос на выборку суммы данных
  #1  
Старый 07.07.2008, 12:38
Аватар для ZneP
ZneP
Познающий
Регистрация: 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


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

  #2  
Старый 07.07.2008, 13:35
Аватар для spider-intruder
spider-intruder
Постоянный
Регистрация: 10.12.2005
Сообщений: 939
Провел на форуме:
3886281

Репутация: 929


Отправить сообщение для spider-intruder с помощью ICQ
По умолчанию

А ну сделай просто select summa from T1, че там?
Странно как то это )
 
Ответить с цитированием

  #3  
Старый 07.07.2008, 14:22
Аватар для ZneP
ZneP
Познающий
Регистрация: 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() вызываемых в запросе
 
Ответить с цитированием

  #4  
Старый 07.07.2008, 14:24
Аватар для Red_Red1
Red_Red1
Участник форума
Регистрация: 12.01.2007
Сообщений: 262
Провел на форуме:
4608122

Репутация: 874
Отправить сообщение для Red_Red1 с помощью ICQ
По умолчанию

У тебя ошибка в понимании работы базы данных
Вот посмотри что выдает твой запрос слегка изменненый вот так
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
 
Ответить с цитированием

  #5  
Старый 07.07.2008, 14:37
Аватар для ZneP
ZneP
Познающий
Регистрация: 07.11.2006
Сообщений: 59
Провел на форуме:
180703

Репутация: 11
По умолчанию

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

  #6  
Старый 07.07.2008, 14:44
Аватар для Red_Red1
Red_Red1
Участник форума
Регистрация: 12.01.2007
Сообщений: 262
Провел на форуме:
4608122

Репутация: 874
Отправить сообщение для Red_Red1 с помощью ICQ
По умолчанию

Без юнион это обязательное условие, или тебе нужно именно в одной строке?
 
Ответить с цитированием

  #7  
Старый 07.07.2008, 14:57
Аватар для ZneP
ZneP
Познающий
Регистрация: 07.11.2006
Сообщений: 59
Провел на форуме:
180703

Репутация: 11
По умолчанию

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

не
40
30
80

а
40 30 80
 
Ответить с цитированием

  #8  
Старый 07.07.2008, 15:05
Аватар для VDShark
VDShark
Участник форума
Регистрация: 01.02.2007
Сообщений: 286
Провел на форуме:
804931

Репутация: 526
По умолчанию

Цитата:
Сообщение от ZneP  
Да, нужно чтобы в одной строке отображались

не
40
30
80

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

  #9  
Старый 07.07.2008, 15:14
Аватар для ZneP
ZneP
Познающий
Регистрация: 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..
 
Ответить с цитированием

  #10  
Старый 07.07.2008, 15:17
Аватар для VDShark
VDShark
Участник форума
Регистрация: 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)
 
Ответить с цитированием
Ответ



Похожие темы
Тема Автор Раздел Ответов Последнее сообщение
[ Обзор уязвимостей CFM(Cold-Fusion) ] Ded MustD!e Сценарии/CMF/СMS 4 27.05.2008 16:28
Защита сервера! Help need goodkit Windows 4 08.01.2008 10:43
Внедрение Sql кода с завязанными глазами k00p3r Чужие Статьи 0 12.06.2005 20:48
Сидит ли тут backdoor? Buf АнтиАдмин 6 17.08.2004 06:29



Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ