Access Запрос на выборку суммы данных

Discussion in 'PHP' started by ZneP, 7 Jul 2008.

  1. ZneP

    ZneP Elder - Старейшина

    Joined:
    7 Nov 2006
    Messages:
    55
    Likes Received:
    5
    Reputations:
    0
    Всем привет!

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

    spider-intruder Elder - Старейшина

    Joined:
    9 Dec 2005
    Messages:
    700
    Likes Received:
    339
    Reputations:
    37
    А ну сделай просто select summa from T1, че там?
    Странно как то это )
     
  3. ZneP

    ZneP Elder - Старейшина

    Joined:
    7 Nov 2006
    Messages:
    55
    Likes Received:
    5
    Reputations:
    0
    Так оно нормально работает

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


    если сделать
    SELECT SUM(T1.summa), SUM (T2.summa)
    FROM Table T1, Table T2

    то сумма данных перемножается, причем коэффициент умножения зависит от кол-ва строк в таблицах и кол-ва функций SUM() вызываемых в запросе
     
  4. Red_Red1

    Red_Red1 Banned

    Joined:
    12 Jan 2007
    Messages:
    246
    Likes Received:
    258
    Reputations:
    83
    У тебя ошибка в понимании работы базы данных
    Вот посмотри что выдает твой запрос слегка изменненый вот так
    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
     
    2 people like this.
  5. ZneP

    ZneP Elder - Старейшина

    Joined:
    7 Nov 2006
    Messages:
    55
    Likes Received:
    5
    Reputations:
    0
    Это я знаю, но дело в том, что мне нужно суммы данных в одной строке, т.е. нужно выполнить запрос без Union
     
  6. Red_Red1

    Red_Red1 Banned

    Joined:
    12 Jan 2007
    Messages:
    246
    Likes Received:
    258
    Reputations:
    83
    Без юнион это обязательное условие, или тебе нужно именно в одной строке?
     
  7. ZneP

    ZneP Elder - Старейшина

    Joined:
    7 Nov 2006
    Messages:
    55
    Likes Received:
    5
    Reputations:
    0
    Да, нужно чтобы в одной строке отображались

    не
    40
    30
    80

    а
    40 30 80
     
  8. VDShark

    VDShark Elder - Старейшина

    Joined:
    1 Feb 2007
    Messages:
    260
    Likes Received:
    158
    Reputations:
    62
    В качестве источника (FROM) используешь вышеприведенный запрос (с юнионами) - т.е. юзаешь пдзапрос, а потом вибираешь что тебе нужно. Все бут в одной строке, все счастливы и довольны.
     
    1 person likes this.
  9. ZneP

    ZneP Elder - Старейшина

    Joined:
    7 Nov 2006
    Messages:
    55
    Likes Received:
    5
    Reputations:
    0
    Сначало я решил проблему след. образом:
    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


    Огромное Всем спасибо!!!
     
    #9 ZneP, 7 Jul 2008
    Last edited: 7 Jul 2008
  10. VDShark

    VDShark Elder - Старейшина

    Joined:
    1 Feb 2007
    Messages:
    260
    Likes Received:
    158
    Reputations:
    62
    Хотя то что я написал канешн извращение... можно нечто вродь такого:

    Select
    (SELECT SUM(T1.summa) FROM Table1 T1),
    (SELECT SUM(T2.summa) FROM Table2 T2),
    (SELECT SUM(T3.summa) FROM Table3 T3)
     
    1 person likes this.