Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Помогите просуммировать ... / 8 сообщений из 8, страница 1 из 1
29.09.2004, 17:41
    #32717403
crumb
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите просуммировать ...
Помогите решить проблему, есть таблица в которой например есть поля:
id
date - это поле в котором хранится дата начала каждого месяца (2004-09-01)
val1 - int
val2 - int
val3 - int
...
date_mod - здесь дата внесения данных (2004-09-29 16:32:11)

Так вот поле date это отчетный период. В течении месяца вносятся данные, поле date остается одно и тоже ( в пределах месяца), а поле date_mod принимает значение даты вноса данных.

Нужно вот что сделать, сгрупировать по полю date, взять последнее значение полей val1, val2, val3 (брать последнее значение по полю date_mod) и найти суммы val1, val2, val3 за все периоды (по полю date).

Что-то типа :
Код: plaintext
1.
2.
3.
4.
SELECT sum(val1),sum(val2),sum(val3)
FROM table
GROUP BY date
ORDER BY date_mod DESC
...
Рейтинг: 0 / 0
29.09.2004, 21:20
    #32717754
mahoune
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите просуммировать ...
Версия MySQL какая?

Это можно только через подзапрос или через временну таблицу!

Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
CREATE TEMPORARY TABLE t1 (date, date_mod, sval1, sval2, sval3);

INSERT INTO t1
SELECT date, MAX(date_mod), SUM(val1), SUM(val2), SUM(val3)
FROM table
GROUP BY date;

SELECT t1.date, t1.sval1, t1.sval2, t1.sval3, a.val1, a.val2, a.val3
FROM t1
LEFT JOIN table a ON a.date = t1.date AND a.date_mod = t1.made
ORDER BY t1.date, t1.date_mod

Код: plaintext
 .  http://sql.ru/]mahoune  
...
Рейтинг: 0 / 0
30.09.2004, 09:39
    #32718023
crumb
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите просуммировать ...
Версия, которая не потдерживает вложенные запросы, (<4.0).
t1.made ?????

а если через вложенные запросы, то как будет выглядеть?

Напомню что нужно только суммы последних значений величин val1, val2, val3 , за все периоды (date).

Спасибо!
...
Рейтинг: 0 / 0
30.09.2004, 13:27
    #32718622
crumb
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите просуммировать ...
Вот начал разбираться, так запрос типа:

Код: plaintext
1.
2.
3.
4.
SELECT date, MAX(date_mod) as date_mod, val1
FROM table
GROUP BY date
ORDER BY date_mod DESC;

выдает date_mod как и положено последнюю, а вот значения val1 не последние, т.е. не соответствует date_mod !!! странно, почему ?
...
Рейтинг: 0 / 0
01.10.2004, 11:06
    #32719686
Помогите просуммировать ...
С временной табличкой вроде так получается:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
CREATE TEMPORARY TABLE tmptbl (maxdm date);

INSERT INTO tmptbl
	SELECT max(date_mod)
		FROM tab
			GROUP BY date;

SELECT sum(t1.val1), sum(t1.val2), sum(t1.val3)
	FROM tab t1, tmptbl t2
		WHERE t1.date_mod=t2.maxdm;

crumbВот начал разбираться, так запрос типа:

Код: plaintext
1.
2.
3.
4.
SELECT date, MAX(date_mod) as date_mod, val1
FROM table
GROUP BY date
ORDER BY date_mod DESC;

выдает date_mod как и положено последнюю, а вот значения val1 не последние, т.е. не соответствует date_mod !!! странно, почему ?

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

З.Ы.:А представь себе, что у тебя в двух записях значения date_mod одинаковые и соответствуют максимальным. Что прикажете выдавать серверу?
...
Рейтинг: 0 / 0
01.10.2004, 16:42
    #32720464
crumb
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите просуммировать ...
Спасибо, Олег Олегович все заработало как нужно :) Правда смущает временная таблица ... но ничего.
...
Рейтинг: 0 / 0
02.10.2004, 10:14
    #32721004
Помогите просуммировать ...
crumbСпасибо, Олег Олегович все заработало как нужно :) Правда смущает временная таблица ... но ничего.

Если смущает - обновляй версию. Тогда такой вот вложенный:

Код: plaintext
1.
2.
3.
4.
5.
SELECT sum(val1), sum(val2), sum(val3)
FROM tab
WHERE date_mod IN (
	SELECT max(date_mod) FROM tab GROUP BY date
)

по идее должен быстрее отрабатывать, хотя, далеко не факт. Было б интересно узнать.
...
Рейтинг: 0 / 0
04.10.2004, 11:15
    #32721775
crumb
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Помогите просуммировать ...
Обновить не могу :(
Возможно придеться переносить все на оракл, пам и проверю вложенные запросы....

Может можно все загнать в запросы? Вот как делаю:
Код: plaintext
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
CREATE TEMPORARY TABLE tmptbl (maxdm date);
SELECT max(date_mod)
FROM tab
GROUP BY date;

SELECT sum(t1.val1), sum(t1.val2), sum(t1.val3)
FROM tab t1, tmptbl t2
WHERE t1.date_mod=t2.maxdm
AND flag= 1 ;

SELECT sum(t1.val1), sum(t1.val2), sum(t1.val3)
FROM tab t1, tmptbl t2
WHERE t1.date_mod=t2.maxdm
AND flag= 2 ;
Потом ручками отнимаю из результатов 1 селекта результаты 2 селекта.

Хотелось бы объеденить 2 послених селекта и ручное вычисление разности в запросы к базе ...
...
Рейтинг: 0 / 0
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Помогите просуммировать ... / 8 сообщений из 8, страница 1 из 1
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]