Access. Использование функции SUM() в запросе
От: Аноним  
Дата: 08.07.08 08:07
Оценка:
Добрый день!

У меня есть БД Access

В ней есть 4 таблицы: Oplata1, Oplata2, Oplata3, Schet
Все таблицы Oplata имеют одинаковые поля:
o_id
o_summa
s_id — идентификатор счета

Таблица Schet имеет след. поля:
s_id — идентификатор счета
s_nomer

Для каждого счета существует несколько оплат.
Мне нужно сделать выборку сумм оплат каждого счета по каждой таблице Oplata

Наглядный пример:
Oplata1
o_id o_summa s_id
1 20,00 1
2 10,00 1
3 37,00 2

Oplata2
o_id o_summa s_id
1 15,00 1
2 35,00 1
3 23,00 2

Oplata3
o_id o_summa s_id
1 5,00 1
2 5,00 1
3 14,00 2

Schet
s_id s_nomer
1 15976
2 56532

После выполнения запроса
SELECT SUM(O1.o_summa), SUM(O2.o_summa), SUM(O3.o_summa)
FROM Oplata1 O1, Oplata2 O2, Oplata3 O3, Schet S
WHERE O1.s_id=S.s_id AND O2.s_id=S.s_id AND O3.s_id=S.s_id

мне выводятся замноженные данные, где коэффициент умножения зависит от кол-во строк в таблицах Oplata
а нужно, чтобы вывелись след. данные:
SUM(O1.o_summa) SUM(O2.o_summa) SUM(O3.o_summa)
30,00 50,00 10,00
37,00 23,00 14,00

Если делать выборку только из любой одной таблицы Oplata, то все нормально

Как мне правильно составить запрос по выборке суммы данных?
Подскажите плиз, очень нужно. Без этого весь процесс разработки стоит
Re: Access. Использование функции SUM() в запросе
От: Аноним  
Дата: 08.07.08 08:16
Оценка:
Все просто, сделай 3 отдельных выборки и объедини их через Union ALL, а потом это дело сгруппируй....
Re: Access. Использование функции SUM() в запросе
От: vladpol Украина http://vlad-mislitel.livejournal.com/
Дата: 08.07.08 08:17
Оценка:
Здравствуйте, Аноним, Вы писали:

А>После выполнения запроса

А>SELECT SUM(O1.o_summa), SUM(O2.o_summa), SUM(O3.o_summa)
А>FROM Oplata1 O1, Oplata2 O2, Oplata3 O3, Schet S
А>WHERE O1.s_id=S.s_id AND O2.s_id=S.s_id AND O3.s_id=S.s_id

А>мне выводятся замноженные данные, где коэффициент умножения зависит от кол-во строк в таблицах Oplata

А>а нужно, чтобы вывелись след. данные:
А>SUM(O1.o_summa) SUM(O2.o_summa) SUM(O3.o_summa)
А> 30,00 50,00 10,00
А> 37,00 23,00 14,00

А>Если делать выборку только из любой одной таблицы Oplata, то все нормально


А>Как мне правильно составить запрос по выборке суммы данных?

А>Подскажите плиз, очень нужно. Без этого весь процесс разработки стоит

Попробуйте

SELECT SUM(O1.o_summa), SUM(O2.o_summa), SUM(O3.o_summa)
FROM Oplata1 O1
left join Oplata2 O2 on O2.s_id=S.s_id
left join Oplata3 O3 on O3.s_id=S.s_id
С уважением, Владислав Полищук
Re[2]: Access. Использование функции SUM() в запросе
От: ZneP Россия  
Дата: 08.07.08 08:56
Оценка:
Здравствуйте, vladpol, Вы писали:

V>Попробуйте


V>SELECT SUM(O1.o_summa), SUM(O2.o_summa), SUM(O3.o_summa)

V>FROM Oplata1 O1
V>left join Oplata2 O2 on O2.s_id=S.s_id
V>left join Oplata3 O3 on O3.s_id=S.s_id


Сразу вылетает ошибка, так как LEFT JOIN применяется к таблице Oplata1, а сравнение идет с таблицей Schet


PS. UNION мне использовать нельзя, так как суммы данных по каждому счету должны быть в одной строке
Re[2]: Access. Использование функции SUM() в запросе
От: Niteshade Россия  
Дата: 08.07.08 09:03
Оценка:
Здравствуйте, vladpol, Вы писали:
V>Попробуйте
как left join спасет от удвоения/утроения/и т.д. данных?)
Re: Access. Использование функции SUM() в запросе
От: Niteshade Россия  
Дата: 08.07.08 09:10
Оценка:
Здравствуйте, Аноним, Вы писали:
А>После выполнения запроса
А>SELECT SUM(O1.o_summa), SUM(O2.o_summa), SUM(O3.o_summa)
А>FROM Oplata1 O1, Oplata2 O2, Oplata3 O3, Schet S
А>WHERE O1.s_id=S.s_id AND O2.s_id=S.s_id AND O3.s_id=S.s_id

А>мне выводятся замноженные данные, где коэффициент умножения зависит от кол-во строк в таблицах Oplata

А>а нужно, чтобы вывелись след. данные:
А>SUM(O1.o_summa) SUM(O2.o_summa) SUM(O3.o_summa)
А> 30,00 50,00 10,00
А> 37,00 23,00 14,00

если поддерживается запрос из запроса, то
select t.s_id, s.agg, s2.agg, s3.agg
from Schet t,
left join (select ss.s_id, sum(ss.summa) agg
from oplata1 ss
group by ss.s_id
) s
on t.s_id = s.s_id
и т.д.

если не поддерживаются внешние соединения, то, например:
select t.s_id, (select sum(ss.summa) from oplata1 ss where ss.s_id = t.s_id) agg, ...
from Schet t
Re[3]: Access. Использование функции SUM() в запросе
От: Аноним  
Дата: 08.07.08 09:27
Оценка:
По моему я четко написал, потом сгруппируй...
Вот тебе готовый, рабочий вариант на основе твоего примера


SELECT [4].s_id, [4].s_nomer, Sum([4].[Sum-o_summa]) AS [Sum-Sum-o_summa]
FROM (SELECT Schet.s_id, Schet.s_nomer, Sum(Oplata1.o_summa) AS [Sum-o_summa]
FROM Schet LEFT JOIN Oplata1 ON Schet.s_id = Oplata1.s_id
GROUP BY Schet.s_id, Schet.s_nomer
Union
SELECT Schet.s_id, Schet.s_nomer, Sum(Oplata2.o_summa) AS [Sum-o_summa]
FROM Schet LEFT JOIN Oplata2 ON Schet.s_id = Oplata2.s_id
GROUP BY Schet.s_id, Schet.s_nomer
UNION SELECT Schet.s_id, Schet.s_nomer, Sum(Oplata3.o_summa) AS [Sum-o_summa]
FROM Schet LEFT JOIN Oplata3 ON Schet.s_id = Oplata3.s_id
GROUP BY Schet.s_id, Schet.s_nomer) AS 4
GROUP BY [4].s_id, [4].s_nomer;


Вставляешь в запрос и готово, если у тебя конечно все таблицы и поля именно так зовутся....

Согласен, решение возможно топорное... но на малой таблице и так сойдет... через ЖО, зато работает... Если у кого найдется более простой рабочий вариант, было бы интересно...
Re[4]: Access. Использование функции SUM() в запросе
От: Niteshade Россия  
Дата: 08.07.08 09:34
Оценка:
Здравствуйте, Аноним, Вы писали:

А>По моему я четко написал, потом сгруппируй...

А>Вот тебе готовый, рабочий вариант на основе твоего примера


А>
А>SELECT [4].s_id, [4].s_nomer, Sum([4].[Sum-o_summa]) AS [Sum-Sum-o_summa]
А>FROM (SELECT Schet.s_id, Schet.s_nomer, Sum(Oplata1.o_summa) AS [Sum-o_summa]
А>FROM Schet LEFT JOIN Oplata1 ON Schet.s_id = Oplata1.s_id
А>GROUP BY Schet.s_id, Schet.s_nomer
А>Union
А>SELECT Schet.s_id, Schet.s_nomer, Sum(Oplata2.o_summa) AS [Sum-o_summa]
А>FROM Schet LEFT JOIN Oplata2 ON Schet.s_id = Oplata2.s_id
А>GROUP BY Schet.s_id, Schet.s_nomer
А>UNION SELECT Schet.s_id, Schet.s_nomer, Sum(Oplata3.o_summa) AS [Sum-o_summa]
А>FROM Schet LEFT JOIN Oplata3 ON Schet.s_id = Oplata3.s_id
А>GROUP BY Schet.s_id, Schet.s_nomer) AS 4
А>GROUP BY [4].s_id, [4].s_nomer;
А>

ему нужны суммы для каждого счета из Schet по каждой из трех таблиц отдельно — это раз
а во-вторых, подумайте, что будет если для одного s_id будет одинаковая сумма, например, в oplata1 и oplata2
Re[4]: Access. Использование функции SUM() в запросе
От: ZneP Россия  
Дата: 08.07.08 09:46
Оценка:
Здравствуйте, Аноним, Вы писали:

А>По моему я четко написал, потом сгруппируй...

А>Вот тебе готовый, рабочий вариант на основе твоего примера


А>
А>SELECT [4].s_id, [4].s_nomer, Sum([4].[Sum-o_summa]) AS [Sum-Sum-o_summa]
А>FROM (SELECT Schet.s_id, Schet.s_nomer, Sum(Oplata1.o_summa) AS [Sum-o_summa]
А>FROM Schet LEFT JOIN Oplata1 ON Schet.s_id = Oplata1.s_id
А>GROUP BY Schet.s_id, Schet.s_nomer
А>Union
А>SELECT Schet.s_id, Schet.s_nomer, Sum(Oplata2.o_summa) AS [Sum-o_summa]
А>FROM Schet LEFT JOIN Oplata2 ON Schet.s_id = Oplata2.s_id
А>GROUP BY Schet.s_id, Schet.s_nomer
А>UNION SELECT Schet.s_id, Schet.s_nomer, Sum(Oplata3.o_summa) AS [Sum-o_summa]
А>FROM Schet LEFT JOIN Oplata3 ON Schet.s_id = Oplata3.s_id
А>GROUP BY Schet.s_id, Schet.s_nomer) AS 4
А>GROUP BY [4].s_id, [4].s_nomer;
А>


А>Вставляешь в запрос и готово, если у тебя конечно все таблицы и поля именно так зовутся....


А>Согласен, решение возможно топорное... но на малой таблице и так сойдет... через ЖО, зато работает... Если у кого найдется более простой рабочий вариант, было бы интересно...



Такой запрос просто вывел сумму всех таблиц по каждому счету, а мне нужно, чтобы в каждой строке была сумма из каждой таблицы по каждому счету (каждый счет — новая строка, в которой 3 поля с суммами из каждой таблице по данному счету)
Re[3]: Access. Использование функции SUM() в запросе
От: vladpol Украина http://vlad-mislitel.livejournal.com/
Дата: 08.07.08 10:11
Оценка:
Здравствуйте, ZneP, Вы писали:

ZP>Здравствуйте, vladpol, Вы писали:


V>>Попробуйте


V>>SELECT SUM(O1.o_summa), SUM(O2.o_summa), SUM(O3.o_summa)

V>>FROM Oplata1 O1
V>>left join Oplata2 O2 on O2.s_id=S.s_id
V>>left join Oplata3 O3 on O3.s_id=S.s_id


ZP>Сразу вылетает ошибка, так как LEFT JOIN применяется к таблице Oplata1, а сравнение идет с таблицей Schet



сорри

SELECT SUM(O1.o_summa), SUM(O2.o_summa), SUM(O3.o_summa)
FROM Schet S
left join Oplata1 O1 on O1.s_id=S.s_id
left join Oplata2 O2 on O2.s_id=S.s_id
left join Oplata3 O3 on O3.s_id=S.s_id

P.S. Я не уверен, что это поможет, но попробовать стоит
С уважением, Владислав Полищук
Re[5]: Access. Использование функции SUM() в запросе
От: ZneP Россия  
Дата: 08.07.08 10:12
Оценка:
Почему-то при выполнении запроса

SELECT S.s_id, OS1.o_summa, OS2.o_summa
FROM Schet S
LEFT JOIN (SELECT O1.s_id, SUM(O1.o_summa) AS o_summa FROM Oplata1 O1 GROUP BY O1.s_id) AS OS1 ON OS1.s_id=S.s_id,
Schet S2
LEFT JOIN (SELECT O2.s_id, SUM(O2.o_summa) AS o_summa FROM Oplata2 O2 GROUP BY O2.s_id) AS OS2 ON OS2.s_id=S2.s_id
GROUP BY S.s_id, OS1.o_summa, OS2.o_summa

появляется ошибка "Не поддерживается выражение объединения."

А если такой:
SELECT S.s_id, OS1.o_summa, OS2.o_summa
FROM Schet S
LEFT JOIN (SELECT O1.s_id, SUM(O1.o_summa) AS o_summa FROM Oplata1 O1 GROUP BY O1.s_id) AS OS1 ON OS1.s_id=S.s_id
LEFT JOIN (SELECT O2.s_id, SUM(O2.o_summa) AS o_summa FROM Oplata2 O2 GROUP BY O2.s_id) AS OS2 ON OS2.s_id=S2.s_id
GROUP BY S.s_id, OS1.o_summa, OS2.o_summa

"Ошибка синтаксиса (пропущен оператор) в выражении запроса "OS1.s_id=S.s_id
LEFT JOIN (SELECT O2.s_id, SUM(O2.o_summa) AS o_summa FROM Oplata2 O2 GROUP BY O2.s_id) AS OS2 ON OS2.s_id=S2.s_id"
Re[5]: Access. Использование функции SUM() в запросе
От: Аноним  
Дата: 08.07.08 10:23
Оценка:
Так что ли?

s_id Sum-o_summa Sum-o_summa1 Sum-o_summa2
1 840,00р. 200,00р. 40,00р.
2 37,00р. 23,00р. 14,00р.

Тогда вот...

SELECT Oplata1.s_id, Sum(Oplata1.o_summa) AS [Sum-o_summa], Sum(Oplata2.o_summa) AS [Sum-o_summa1], Sum(Oplata3.o_summa) AS [Sum-o_summa2]
FROM (Oplata1 INNER JOIN Oplata2 ON Oplata1.s_id = Oplata2.s_id) INNER JOIN Oplata3 ON Oplata2.s_id = Oplata3.s_id
GROUP BY Oplata1.s_id;
Re[6]: Access. Использование функции SUM() в запросе
От: vladpol Украина http://vlad-mislitel.livejournal.com/
Дата: 08.07.08 10:25
Оценка:
Здравствуйте, ZneP, Вы писали:

ZP>Почему-то при выполнении запроса


ZP>SELECT S.s_id, OS1.o_summa, OS2.o_summa

ZP>FROM Schet S
ZP>LEFT JOIN (SELECT O1.s_id, SUM(O1.o_summa) AS o_summa FROM Oplata1 O1 GROUP BY O1.s_id) AS OS1 ON OS1.s_id=S.s_id,
ZP>Schet S2
ZP>LEFT JOIN (SELECT O2.s_id, SUM(O2.o_summa) AS o_summa FROM Oplata2 O2 GROUP BY O2.s_id) AS OS2 ON OS2.s_id=S2.s_id
ZP>GROUP BY S.s_id, OS1.o_summa, OS2.o_summa

ZP>появляется ошибка "Не поддерживается выражение объединения."


ZP>А если такой:

ZP>SELECT S.s_id, OS1.o_summa, OS2.o_summa
ZP>FROM Schet S
ZP>LEFT JOIN (SELECT O1.s_id, SUM(O1.o_summa) AS o_summa FROM Oplata1 O1 GROUP BY O1.s_id) AS OS1 ON OS1.s_id=S.s_id
ZP>LEFT JOIN (SELECT O2.s_id, SUM(O2.o_summa) AS o_summa FROM Oplata2 O2 GROUP BY O2.s_id) AS OS2 ON OS2.s_id=S2.s_id
ZP>GROUP BY S.s_id, OS1.o_summa, OS2.o_summa

ZP>"Ошибка синтаксиса (пропущен оператор) в выражении запроса "OS1.s_id=S.s_id

ZP>LEFT JOIN (SELECT O2.s_id, SUM(O2.o_summa) AS o_summa FROM Oplata2 O2 GROUP BY O2.s_id) AS OS2 ON OS2.s_id=S2.s_id"

Тогда сорри я в основном работал с Interbase, там, видимо по другому
С уважением, Владислав Полищук
Re[6]: Access. Использование функции SUM() в запросе
От: Аноним  
Дата: 08.07.08 10:50
Оценка:
Сорри.. не посмотрел на итоговую сумму, каюсь... так тоже не годится... но вот это похоже что нужно...

SELECT [1ф].s_id, [1ф].[Sum-o_summa1], [2ф].[Sum-o_summa2], [3ф].[Sum-o_summa3]
FROM (
(SELECT Sum(Oplata1.o_summa) AS [Sum-o_summa1], Oplata1.s_id
FROM Oplata1
GROUP BY Oplata1.s_id) asINNER JOIN 
(SELECT Sum(Oplata2.o_summa) AS [Sum-o_summa2], Oplata2.s_id
FROM Oplata2
GROUP BY Oplata2.s_id) asON [1ф].s_id=[2ф].s_id) 
INNER JOIN 
(SELECT Sum(Oplata3.o_summa) AS [Sum-o_summa3], Oplata3.s_id
FROM Oplata3
GROUP BY Oplata3.s_id) asON [2ф].s_id=[3ф].s_id;



Результат следующий...
s_id Sum-o_summa1 Sum-o_summa2 Sum-o_summa3
1 210,00р. 50,00р. 10,00р.
2 37,00р. 23,00р. 14,00р.

Надеюсь теперь то что нужно??
Re[7]: Access. Использование функции SUM() в запросе
От: ZneP Россия  
Дата: 08.07.08 11:25
Оценка:
А>Результат следующий...
А>s_id Sum-o_summa1 Sum-o_summa2 Sum-o_summa3
А>1 210,00р. 50,00р. 10,00р.
А>2 37,00р. 23,00р. 14,00р.

А>Надеюсь теперь то что нужно??


нет


Но я уже нашел решение проблемы
ОГРОМНЕЙШЕЕ СПАСИБО ВСЕМ, КТО ВЫКЛАДЫВАЛ СВОИ ВАРИАНТЫ РЕШЕНИЯ ПРОБЛЕМЫ

по Вашим решениям я составил следующий запрос:

SELECT S.s_id, OS1.o_summa, OS2.o_summa, OS3.o_summa
FROM ((Schet S LEFT JOIN (SELECT O1.s_id, SUM(O1.o_summa) AS o_summa FROM Oplata1 O1 GROUP BY O1.s_id) AS OS1 ON OS1.s_id=S.s_id)
LEFT JOIN (SELECT O2.s_id, SUM(O2.o_summa) AS o_summa FROM Oplata2 O2 GROUP BY O2.s_id) AS OS2 ON OS2.s_id=S.s_id)
LEFT JOIN (SELECT O3.s_id, SUM(O3.o_summa) AS o_summa FROM Oplata3 O3 GROUP BY O3.s_id) AS OS3 ON OS3.s_id=S.s_id
GROUP BY S.s_id, OS1.o_summa, OS2.o_summa, OS3.o_summa

И теперь ВСЕ работает


Еще раз всем спасибо
Re[8]: Access. Использование функции SUM() в запросе
От: Аноним  
Дата: 08.07.08 11:32
Оценка:
Самое главное почти как мой вариант... а результаты то те же... Интересно при большой выборке, какой вариант быстрее.... подозреваю что твой.... но проверить бы ло бы интересно...
Re[9]: Access. Использование функции SUM() в запросе
От: Аноним  
Дата: 08.07.08 11:50
Оценка:
Провел небольшой тестик, доведя до 200.000 записей в каждой таблице... твой запрос в три раза шустрее, а мой к тому же при большом количестве данных начал отказыватся работать...
Re[10]: Access. Использование функции SUM() в запросе
От: ZneP Россия  
Дата: 08.07.08 12:03
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Провел небольшой тестик, доведя до 200.000 записей в каждой таблице... твой запрос в три раза шустрее, а мой к тому же при большом количестве данных начал отказыватся работать...



у меня как раз будет работа с большим кол-вом записей, правда поменьше 200.000
Re[6]: Access. Использование функции SUM() в запросе
От: Niteshade Россия  
Дата: 09.07.08 02:08
Оценка:
Здравствуйте, Аноним, Вы писали:

А>
А>SELECT Oplata1.s_id, Sum(Oplata1.o_summa) AS [Sum-o_summa], Sum(Oplata2.o_summa) AS [Sum-o_summa1], Sum(Oplata3.o_summa) AS [Sum-o_summa2]
А>FROM (Oplata1 INNER JOIN Oplata2 ON Oplata1.s_id = Oplata2.s_id) INNER JOIN Oplata3 ON Oplata2.s_id = Oplata3.s_id
А>GROUP BY Oplata1.s_id;
А>

в Вашем варианте задвоятся суммы по oplata3 в случае, если в oplata2 две записи с одинаковым счетом
Re[8]: Access. Использование функции SUM() в запросе
От: Niteshade Россия  
Дата: 09.07.08 02:11
Оценка:
Здравствуйте, ZneP, Вы писали:

ZP>по Вашим решениям я составил следующий запрос:


ZP>SELECT S.s_id, OS1.o_summa, OS2.o_summa, OS3.o_summa

ZP>FROM ((Schet S LEFT JOIN (SELECT O1.s_id, SUM(O1.o_summa) AS o_summa FROM Oplata1 O1 GROUP BY O1.s_id) AS OS1 ON OS1.s_id=S.s_id)
ZP>LEFT JOIN (SELECT O2.s_id, SUM(O2.o_summa) AS o_summa FROM Oplata2 O2 GROUP BY O2.s_id) AS OS2 ON OS2.s_id=S.s_id)
ZP>LEFT JOIN (SELECT O3.s_id, SUM(O3.o_summa) AS o_summa FROM Oplata3 O3 GROUP BY O3.s_id) AS OS3 ON OS3.s_id=S.s_id
ZP>GROUP BY S.s_id, OS1.o_summa, OS2.o_summa, OS3.o_summa
последний group by (GROUP BY S.s_id, OS1.o_summa, OS2.o_summa, OS3.o_summa) не нужен


интересно, а чем Ваш вариант отличается от предложенного:
select t.s_id, s.agg, s2.agg, s3.agg
from Schet t,
left join (select ss.s_id, sum(ss.summa) agg
from oplata1 ss
group by ss.s_id
) s
on t.s_id = s.s_id

?))
Re[9]: Access. Использование функции SUM() в запросе
От: Niteshade Россия  
Дата: 09.07.08 02:13
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Самое главное почти как мой вариант... а результаты то те же... Интересно при большой выборке, какой вариант быстрее.... подозреваю что твой.... но проверить бы ло бы интересно...

Ваш вариант неработоспособен
во-первых, он задваивает данные, при наличии в oplata1, oplata2 более одной записи по счету
во-вторых, он элиминирует данные, если, например, в oplata1 нет записей по тому счету, который присутствует в oplata2, oplata3
Re[4]: Access. Использование функции SUM() в запросе
От: Niteshade Россия  
Дата: 09.07.08 02:15
Оценка:
Здравствуйте, vladpol, Вы писали:


V>SELECT SUM(O1.o_summa), SUM(O2.o_summa), SUM(O3.o_summa)

V>FROM Schet S
V>left join Oplata1 O1 on O1.s_id=S.s_id
V>left join Oplata2 O2 on O2.s_id=S.s_id
V>left join Oplata3 O3 on O3.s_id=S.s_id

V>P.S. Я не уверен, что это поможет, но попробовать стоит

в общем случае, этот запрос неверен
почему — уже писал
учите матчасть, а именно — SQL
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.