Гость
Целевая тема:
Создать новую тему:
Автор:
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Оптимизировать запрос / 16 сообщений из 16, страница 1 из 1
22.09.2013, 20:45:07
    #38404138
motorov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизировать запрос
Здравствуйте
я формирую отчет, делаю это таким запросом
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
select c.id, c.name, (SELECT COUNT( * ) 
FROM customer cc
LEFT JOIN services_vagon sp ON cc.id = sp.id_costumer
WHERE sp.sost =1
AND sp.type_vagon =  'Порожний'
AND sp.type_uborka =  'Груженый'
AND cc.id =c.id) pogr, 
0 pogr_pr, 
0 pogr_kpr,
(SELECT COUNT( s2.id ) 
FROM customer c2
LEFT JOIN services_vagon s2 ON c2.id = s2.id_costumer
WHERE s2.sost =1
AND s2.type_vagon =  'Груженый'
AND s2.type_uborka =  'Порожний'
AND c2.id =c.id) vygr,
0 vygr_pr,
0 vygr_kpr,
(SELECT COUNT( s3.id ) 
FROM customer c3
LEFT JOIN services_vagon s3 ON c3.id = s3.id_costumer
WHERE c3.id =c.id) podan,

(SELECT COUNT( * ) 
FROM customer c4
LEFT JOIN services_vagon s4 ON c4.id = s4.id_costumer
WHERE s4.sost=1 and c4.id =c.id) ubran,

0 peregr,
0 peregr_kprmon,
0 sred_prost,
(SELECT COUNT( * ) 
FROM customer c5
LEFT JOIN services_vagon s5 ON c5.id = s5.id_costumer
WHERE c5.id =c.id and s5.pravo='ОАО РЖД') rjdvag,
0 man

 from customer c
where (SELECT COUNT( s3.id ) 
FROM customer c3
LEFT JOIN services_vagon s3 ON c3.id = s3.id_costumer
WHERE c3.id =c.id)>0



Наверное он очень корявый, но пока не сообразил как его сделать более грамотно
хотя данных еще не так много но уже формирует 16 секунд
посоветуйте как правильно сделать запрос
не могу сообразить
...
Рейтинг: 0 / 0
22.09.2013, 20:53:02
    #38404142
motorov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизировать запрос
точнее такой

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
select c.id, c.name, (SELECT COUNT( * ) 
FROM customer cc
LEFT JOIN services_vagon sp ON cc.id = sp.id_costumer
WHERE sp.sost =1
AND sp.type_vagon =  'Порожний'
AND sp.type_uborka =  'Груженый'
AND cc.id =c.id) pogr, 
0 pogr_pr, 
0 pogr_kpr,
(SELECT COUNT( s2.id ) 
FROM services_vagon s2
WHERE s2.sost =1
AND s2.type_vagon =  'Груженый'
AND s2.type_uborka =  'Порожний'
AND s2.id_costumer =c.id) vygr,
0 vygr_pr,
0 vygr_kpr,
(SELECT COUNT( s3.id ) 
FROM services_vagon s3
WHERE s3.id_costumer =c.id) podan,

(SELECT COUNT( s4.id ) 
FROM services_vagon s4 
WHERE s4.sost=1 and s4.id_costumer =c.id) ubran,

0 peregr,
0 peregr_kprmon,
0 sred_prost,
(SELECT COUNT( * ) 
FROM services_vagon s5 
WHERE s5.id_costumer =c.id and s5.pravo='ОАО РЖД') rjdvag,
0 man

 from customer c
where (SELECT COUNT( s3.id ) 
FROM services_vagon s3 
WHERE s3.id_costumer =c.id)>0
...
Рейтинг: 0 / 0
22.09.2013, 21:02:28
    #38404148
javajdbc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизировать запрос
motorov,

кстати, вот такая прияная штучка:

http://sqlformat.appspot.com/

а вот результат (без изменений, просто чтоб читать можно было) :

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
45.
46.
47.
48.
49.
50.
SELECT 
  c.id, 
  c.name,

  (SELECT COUNT(*)
   FROM customer cc
   LEFT JOIN services_vagon sp ON cc.id = sp.id_costumer
   WHERE sp.sost =1
     AND sp.type_vagon = 'Порожний'
     AND sp.type_uborka = 'Груженый'
     AND cc.id =c.id) pogr,

    0 pogr_pr,
    0 pogr_kpr,

  (SELECT COUNT(s2.id)
   FROM services_vagon s2
   WHERE s2.sost =1
     AND s2.type_vagon = 'Груженый'
     AND s2.type_uborka = 'Порожний'
     AND s2.id_costumer =c.id) vygr,
                               
   0 vygr_pr,
   0 vygr_kpr,

  (SELECT COUNT(s3.id)
   FROM services_vagon s3
   WHERE s3.id_costumer =c.id) podan,

  (SELECT COUNT(s4.id)
   FROM services_vagon s4
   WHERE s4.sost=1
     AND s4.id_costumer =c.id) ubran,
    
  0 peregr,
  0 peregr_kprmon,
  0 sred_prost,
  
  (SELECT COUNT(*)
   FROM services_vagon s5
   WHERE s5.id_costumer =c.id
     AND s5.pravo='ОАО РЖД') rjdvag,

  0 man

FROM customer c
WHERE
    (SELECT COUNT(s3.id)
     FROM services_vagon s3
     WHERE s3.id_costumer =c.id)>0
...
Рейтинг: 0 / 0
22.09.2013, 21:04:54
    #38404150
motorov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизировать запрос
ок, спасибо
...
Рейтинг: 0 / 0
22.09.2013, 21:13:12
    #38404158
javajdbc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизировать запрос
решение довольно простое, переписать так:

1. сделать селецт сначала только по таблице services_vagon

Код: sql
1.
2.
3.
4.
select id_costumer, 
count(1) all_cnt
from services_vagon
group by id_costumer



2. далее все ваши отдельные каунты добавляем так:

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
select id_costumer, 
count(1) all_cnt,

SUM( if (sp.sost =1 
           AND sp.type_vagon = 'Порожний'
            AND sp.type_uborka = 'Груженый')) pogr,

SUM( if (s2.sost =1
AND s2.type_vagon =  'Груженый'
AND s2.type_uborka =  'Порожний' )) vygr

...итд, итп..............

from services_vagon
group by id_costumer



для ясности:
IF(a='a' AND b='b'.....) возврашает 1 если условия
выполняются или 0 если нет.
Тогда SUM(IF(a='a' AND b='b'.....)) возвратит
количество раз когда все условия выполнились
...
Рейтинг: 0 / 0
22.09.2013, 21:15:49
    #38404160
javajdbc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизировать запрос
3. ну а потом соединить этото все с таблицей customer :

select *
from customers
JOIN
(
....большой селект из пункта 2

) zzzz ON c.id = zzzz.id_costumer
...
Рейтинг: 0 / 0
22.09.2013, 21:18:41
    #38404163
javajdbc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизировать запрос
... поправка...

В пункте #2 надо, конечно поправит алиасы,
заменить S2, SV на конкретный алиас, например SV

Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
select id_costumer, 
count(1) all_cnt,

SUM( if (SV.sost =1 
           AND SV.type_vagon = 'Порожний'
            AND SV.type_uborka = 'Груженый')) pogr,

SUM( if (SV.sost =1
AND SV.type_vagon =  'Груженый'
AND SV.type_uborka =  'Порожний' )) vygr

...итд, итп..............

from services_vagon SV
group by id_costumer
...
Рейтинг: 0 / 0
22.09.2013, 21:19:12
    #38404164
motorov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизировать запрос
javajdbc3. ну а потом соединить этото все с таблицей customer :

select *
from customers
JOIN
(
....большой селект из пункта 2

) zzzz ON c.id = zzzz.id_costumer

да лучше, сейчас буду пробовать все собрать и понять. Спасибо
...
Рейтинг: 0 / 0
22.09.2013, 23:18:56
    #38404199
javajdbc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизировать запрос
что-то у меня подозрения что я фигню сморозил.
надо так:

sum(a='a' AND b='b' AND....)

или

sum( if((a='a' AND b='b' AND....),1,0) )

просто IF без ....1,0) должно выдать ошибку
...
Рейтинг: 0 / 0
23.09.2013, 17:17:50
    #38404982
motorov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизировать запрос
По вашим рекомендациям сейчас получился такой запрос
Код: sql
1.
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
select c.name,SV.id_costumer id, 
SUM( if (SV.sost =1 
           AND SV.type_vagon = 'Порожний'
            AND SV.type_uborka = 'Груженый',1,0)) pogr,
0 pogr_pr, 
0 pogr_kpr,
SUM( if (SV.sost =1
AND SV.type_vagon =  'Груженый'
AND SV.type_uborka =  'Порожний',1,0 )) vygr,
0 vygr_pr,
0 vygr_kpr,
count(1) podan,
SUM( if (SV.sost =1,1,0 )) ubran,
0 peregr,
0 peregr_kprmon,
0 sred_prost,
SUM(IF( SV.pravo='ОАО РЖД',1,0)) rjdvag,
0 man

from services_vagon SV left join customer C on SV.`id_costumer`=C.id
where SV.dt_doc>'2013-08-01' and SV.dt_doc<'2013-08-30'
group by id_costumer



только мне еще не понятно как сюда вставить количество в вагонов в прошлом году такого же месяца
и количесто прошлого месяца
...
Рейтинг: 0 / 0
23.09.2013, 17:29:05
    #38405000
javajdbc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизировать запрос
motorov,

1. для скорости лучше сделать селкт и груп бай
сначала на services_vagon и лиш потом подсоединить
таблицу customer (см пункт #3 в предыдуших постах)

2.
>> только мне еще не понятно как сюда вставить
>> количество в вагонов в прошлом году такого же месяца
>> и количесто прошлого месяца

каких еше вагонов, зачем еше вагонов? будьте конкретнее:
примеры данных, четкое описание условий,
если есть -- работаюший вариант СКЛ-а...
...
Рейтинг: 0 / 0
23.09.2013, 18:27:01
    #38405063
motorov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизировать запрос
javajdbcmotorov,

1. для скорости лучше сделать селкт и груп бай
сначала на services_vagon и лиш потом подсоединить
таблицу customer (см пункт #3 в предыдуших постах)

2.
>> только мне еще не понятно как сюда вставить
>> количество в вагонов в прошлом году такого же месяца
>> и количесто прошлого месяца

каких еше вагонов, зачем еше вагонов? будьте конкретнее:
примеры данных, четкое описание условий,
если есть -- работаюший вариант СКЛ-а...

есть поле
Код: sql
1.
2.
3.
SUM( if (SV.sost =1 
           AND SV.type_vagon = 'Порожний'
            AND SV.type_uborka = 'Груженый',1,0)) as po


оно выдает количество погруженных вагонов
мне в отчете нужно чтобы следующее поле было количество
(количесво погруж/количество погруж. в прошлом месяце)*100
и так же нужно к этому месяцу прошлого года
...
Рейтинг: 0 / 0
23.09.2013, 18:36:09
    #38405075
javajdbc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизировать запрос
motorov,

ок, есть парочка подходов:

1. громоздкий:

включить дополнительные временые рамки в WHERE

WHERE....
(SV.dt_doc>'2013-08-01' and SV.dt_doc<'2013-08-30')
or
(SV.dt_doc>'2012-08-01' and SV.dt_doc<'2012-08-30')

а потом в SELECT части использовать конкретные временые рамки:

SELECT
................
SUM(IF( SV.pravo='ОАО РЖД'
AND SV.dt_doc>'2013-08-01'
and SV.dt_doc<'2013-08-30',1,0)) rjdvag_2013,

SUM(IF( SV.pravo='ОАО РЖД'
AND SV.dt_doc>'2012-08-01'
and SV.dt_doc<'2012-08-30',1,0)) rjdvag_2012,
...
Рейтинг: 0 / 0
23.09.2013, 18:40:40
    #38405079
javajdbc
Участник
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизировать запрос
2. более приличные подход будет
сделать репорт с переменными датами:
напромер динамически генерировать на клиенете,
в процедуре, или может VIEW сделать, хотя
может быть медлено.

Затем прогнать 3 репорта (этот месац,
прошлый месяц и прошлуй год) и комбинировать
результат уже на клиенте

3. Ну и продолжение предыдушего варинта:

создать таблицу результатов по месяцам,
заполнить ее селектом из #2 и делать репорты
из таблицы результатов. Раз в месяц надо будет
запонять следующую строчку.
...
Рейтинг: 0 / 0
23.09.2013, 18:42:10
    #38405081
motorov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизировать запрос
да я про такой вариант думал, а он правильный?
тут получится сделать три временных периода текущий месяц, прошлый и текущий в прошлом году
...
Рейтинг: 0 / 0
23.09.2013, 18:43:39
    #38405082
motorov
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Оптимизировать запрос
javajdbc2. более приличные подход будет
сделать репорт с переменными датами:
напромер динамически генерировать на клиенете,
в процедуре, или может VIEW сделать, хотя
может быть медлено.

Затем прогнать 3 репорта (этот месац,
прошлый месяц и прошлуй год) и комбинировать
результат уже на клиенте

3. Ну и продолжение предыдушего варинта:

создать таблицу результатов по месяцам,
заполнить ее селектом из #2 и делать репорты
из таблицы результатов. Раз в месяц надо будет
запонять следующую строчку.

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


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