SQLinfo.ru - Все о MySQL Webew.ru: теория и практика веб-технологий

Форум пользователей MySQL

Задавайте вопросы, мы ответим

Вы не зашли.

#1 14.12.2011 14:47:28

axe79
Участник
Зарегистрирован: 15.07.2010
Сообщений: 4

цикл и массив

добрый день.

нужен совет по построению отчёта

есть таблица с данными order_id , order_date , order_sum

необходимо получить суму по дням с возрастанием т.е.

select order_date, sum(order_sum) from order where order_date <= '2011-01-01'

таким образом мы получаем сумму всех накладных на 2011-01-01

задача стоит в том что б получить набор данных дата, сумма:

2011-01-01  2569,00
2011-01-02  5893,00
2011-01-03  8495,00
2011-01-04  11256,00
...
2011-09-25  758245,00

т.е. каждый день сумирует себя + все предидущие

как я понимаю нужен цикл с инкрементом даты

сразу наткнулся на функции и процедуры и  споткнулся на выводе данных нужен массив поскольку вводить переменные
на каждый день нерационально

можно конечно легко совместить с perl но для начала всё же хотелось бы это попробовать реализовать средствами MySQL

Заранее спасибо.

Неактивен

 

#2 14.12.2011 15:25:31

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: цикл и массив

select @sum:=0;
select order_date, @sum:=@sum+sum_of_day as `сумма нарастающим итогом` from(
select order_date, sum(order_sum) sum_of_day from order group by 1)t1;


или одним запросом
select order_date, @sum:=@sum+sum_of_day `сумма нарастающим итогом` from(
select order_date, sum(order_sum) sum_of_day from order group by 1)t1,(select @sum:=0) t2;


Касательно вашего запроса - массивов нет, но можно использовать временную таблицу.

Неактивен

 

#3 14.12.2011 17:55:10

axe79
Участник
Зарегистрирован: 15.07.2010
Сообщений: 4

Re: цикл и массив

спасибо, результат устраивает
интересно используется свойство цикличной обработки данных "select"ом
или это результат "group"

если не затруднит, ещё один вопрос:
в таблице order есть поле - статус накладной "status"

используя left join объединяется два результата запросов
1. все накладные со статусом in (0,3)
2. только 3

соответственно статус 3 есть не каждый день но необходимо что бы сума была в каждой записи синхронно с результатом запроса  где статус накладных (0,3)

но OUT от второго не содержит данных
пробовал IF но результат уже объеденён "group"

объясняю возможно путанно
вот запрос


set @suma1 = 0;
set @suma2 = 0;

select t1.dates1, @suma1:=@suma1+t1.date_sum1 as day_sum, @suma2:=@suma2+t2.date_sum2 as zberr_sum
from


(select date(oh.dt_come) as dates1, sum(od.amount*i.i_pack_mass)/1000 as date_sum1  from order_head_2011 oh  ,order_invoice_2011 oi
  ,order_data_2011 od , ice_item i , distributors d
  where
   oh.is_deleted = 0  and oh.saveState in (0,3) and oh.proc_manager = 2 and oh.proc_logic = 2 and oh.proc_storage = 2
   and oh.order_id = oi.order_id and oi.isFirst = 3 and oh.dt_Come >= "2011-01-01" and i.ig_id != 15
   and oi.invoice_id = od.id_head and od.id_item = i.ii_id and oh.distrib_id = d.D_id group by date(oh.dt_come)) t1
   
   left join
   
   (select date(oh.dt_come) as dates2, od.amount*i.i_pack_mass)/1000 as date_sum2  from order_head_2011 oh  ,order_invoice_2011 oi
     ,order_data_2011 od , ice_item i , distributors d
     where
      oh.is_deleted = 0  and oh.saveState in (3) and oh.proc_manager = 2 and oh.proc_logic = 2 and oh.proc_storage = 2
      and oh.order_id = oi.order_id and oi.isFirst = 3 and oh.dt_Come >= "2011-01-01" and i.ig_id != 15
      and oi.invoice_id = od.id_head and od.id_item = i.ii_id and oh.distrib_id = d.D_id group by date(oh.dt_come)) t2
     
      on t1.dates1 = t2.dates2

Отредактированно axe79 (14.12.2011 17:58:10)

Неактивен

 

#4 14.12.2011 18:56:05

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: цикл и массив

axe79 написал:

интересно используется свойство цикличной обработки данных "select"ом
или это результат "group"

Подзапрос создает временную таблицу t1, содержащую дату и сумму всех накладных за эту дату. Причем выборка будет упорядочена по дате, так как группировка подразумевает неявную сортировку.
А внешний запрос один раз пробегает по этой выборке суммируя вторую колонку.


axe79 написал:

если не затруднит, ещё один вопрос:

Что-то я не понял что требуется получить. Давайте на примере нескольких тестовых строк. Какой результат вы хотите получить и почему именно такой.

create table `order` (order_date date, order_sum int,order_status int);
insert into `order` values ('2011-01-01',1,0),('2011-01-01',2,3),('2011-01-02',2,0),('2011-01-03',2,3),
('2011-01-04',2,3),('2011-01-05',2,0),('2011-01-05',2,3);
select * from `order`;
+------------+-----------+--------------+
| order_date | order_sum | order_status |
+------------+-----------+--------------+
| 2011-01-01 |         1 |            0 |
| 2011-01-01 |         2 |            3 |
| 2011-01-02 |         2 |            0 |
| 2011-01-03 |         2 |            3 |
| 2011-01-04 |         2 |            3 |
| 2011-01-05 |         2 |            0 |
| 2011-01-05 |         2 |            3 |
+------------+-----------+--------------+

Неактивен

 

#5 15.12.2011 12:58:03

axe79
Участник
Зарегистрирован: 15.07.2010
Сообщений: 4

Re: цикл и массив

должно было отработать где то так))


mysql> set @sum1 = 0,@sum2 = 0;
select ifnull(t1.order_date,'none') dt1,@sum1:=@sum1+ifnull(t1.allsum1,0)  summ1,
         ifnull(t2.order_date,'none') dt2,@sum2:=@sum2+ifnull(t2.allsum2,0)  summ2
from

(select order_date,sum(order_sum) allsum1 from test.order where order_status in (0,3) group by order_date) t1

left join

(select order_date,sum(order_sum) allsum2 from test.order where order_status in (3) group by order_date) t2

on t1.order_date = t2.order_date;




+--------------+---------+--------------+----------+
| dt1            | summ1 | dt2            | summ2  |
+--------------+---------+--------------+----------+
| 2011-01-01 |     3     | 2011-01-01 |     2      |
| 2011-01-02 |     5     | none          |     2      |
| 2011-01-03 |     7     | 2011-01-03 |     4      |
| 2011-01-04 |     9     | 2011-01-04 |     6      |
| 2011-01-05 |    13    | 2011-01-05 |     8      |
+--------------+---------+--------------+----------+
5 rows in set (0.00 sec)

 

Отредактированно axe79 (15.12.2011 13:06:32)

Неактивен

 

#6 15.12.2011 13:02:05

axe79
Участник
Зарегистрирован: 15.07.2010
Сообщений: 4

Re: цикл и массив

я проверил - вывел дату со второго подзапроса
там пусто ... где то теряется((

Неактивен

 

#7 15.12.2011 18:26:51

vasya
Архат
MySQL Authorized Developer
Откуда: Орел
Зарегистрирован: 07.03.2007
Сообщений: 5842

Re: цикл и массив

Я правильно понимаю, что в 5ом посте вы написали запрос, который выводит нужный вам результат?

Единственное дополнение t1.order_date не может принимать null значение, поэтому проверка "ifnull(t1.order_date,'none') dt1" не нужна.

Неактивен

 

Board footer

Работает на PunBB
© Copyright 2002–2008 Rickard Andersson