Задавайте вопросы, мы ответим
Вы не зашли.
Подскажите, пожалуйста.
В таблицу
detailing | CREATE TABLE `detailing` (
`ls` int(6) unsigned NOT NULL,
`number` varchar(10) NOT NULL DEFAULT '0',
`data` date DEFAULT NULL,
`diration_min` smallint(3) unsigned DEFAULT NULL,
`cost_rub` float(6,2) DEFAULT NULL
) ENGINE=InnoDB DEFAULT CHARSET=cp1251 |
ежедневно происходит выгрузка данных с нарастающим итогом, т.е. за 01 число выгружается детализация звонков, за 02 число к детализации за первое число добавляются новые данные и добавляются в таблицу.
Возможно выполнить запрос, показывающий за каждый день реальную детализацию по каждому номеру??
Неактивен
Честно говоря, не понял про нарастающий итог — Вы де добавляете строки
за правильную дату? Тогда можно группировать по ней:
SELECT * FROM detailing GROUP BY data, number;
Еще можете поиграть с GROUP BY ... WITH ROLLUP — может понадобиться
Неактивен
Возможно, я плохо обрисовал ситуацию. Простите... Попробую еще раз. У меня в таблицу каждый день по каждому номеру выгружается длительность телефонных разговоров, причем к значению предыдущего числа прибавляется новое. Например, если я 1-го числа проговорил по телефону 2 минуты, то в детализации за 1-ое число будет 2 минуты. Второго числа я наговорил на 3 минуты и у меня в детализации за второе число отобразиться не 3 минуты, а 5. Мне необходимо выполнить запрос, который бы вычислял, сколько проговорил каждый номер.
Сейчас я за каждый день выгружаю данные в отдельную таблицу, а затем объединяю их:
select tb4.ls, tb4.number, tb4.diration_min - tb3.diration_min
from tb4 left join tb3
on tb4.number=tb3.number;
Не совсем удобно, но работает. Буду признателен, если подскажите, как все это сделать в одной таблице.
Неактивен
SELECT SUM(время звонков) FROM detaling GROUP BY number
Неактивен
Тогда я получу сумму звонков по каждому номеру по всем датам, а мне необходимо разность длительностей по текущей и предыдущей дате по каждому номеру.
Неактивен
Я правильно понимаю, что в таблице лежат данные с начала месяца, а Вы хотите
получить реальное время разговора в день? Логичнее хранить наоборот и, если
есть возможность, лучше таки хранить по человечески. В противном случае, прий-
дется писать каких-нибудь страшных страусов. Например,
SELECT @n := '';
SELECT duration_min - @a, data, IF(@n=number,@a:=duration_min,@a := 0) FROM detaling ORDER BY number, data;
Ах, да, и табличку Вы зря так назвали, раз у Вас там хранится по строке на дату.
Детализация — это по строке на звонок.
Неактивен
Вы правы, но у меня нет возможности хранить данные по человечески, по крайней мере сейчас.
Я набросал запрос:
SET @f:='2011-04-11';
SELECT detailing.ls, detailing.number, detailing.data,
detailing.diration_min - detailing_new.diration_min AS 'Длительность'
FROM detailing INNER JOIN (SELECT number,
diration_min FROM detailing
WHERE data = (SELECT @f - INTERVAL 1 DAY)) AS detailing_new
ON detailing.number = detailing_new.number
WHERE data = @f;
Вроде бы рабочий. Подскажите, пожалуйста, этот запрос имеет право на жизнь, или можно сделать на много проще.
И по поводу таблички. Я ее переименую на statistics. Думаю будет правельнее.
Неактивен
Если работает — значит, имеет
Я бы только подзапросы убрал там, где они не нужны. Например,
WHERE data = @f - INTERVAL 1 DAY сможет использовать индекс.
Неактивен