powered by simpleCommunicator - 2.0.61     © 2026 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / MySQL [игнор отключен] [закрыт для гостей] / Оптимизировать запрос
16 сообщений из 16, страница 1 из 1
Оптимизировать запрос
    #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
Оптимизировать запрос
    #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
Оптимизировать запрос
    #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
Оптимизировать запрос
    #38404150
motorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
ок, спасибо
...
Рейтинг: 0 / 0
Оптимизировать запрос
    #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
Оптимизировать запрос
    #38404160
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
3. ну а потом соединить этото все с таблицей customer :

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

) zzzz ON c.id = zzzz.id_costumer
...
Рейтинг: 0 / 0
Оптимизировать запрос
    #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
Оптимизировать запрос
    #38404164
motorov
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
javajdbc3. ну а потом соединить этото все с таблицей customer :

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

) zzzz ON c.id = zzzz.id_costumer

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

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

или

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

просто IF без ....1,0) должно выдать ошибку
...
Рейтинг: 0 / 0
Оптимизировать запрос
    #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
Оптимизировать запрос
    #38405000
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
motorov,

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

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

каких еше вагонов, зачем еше вагонов? будьте конкретнее:
примеры данных, четкое описание условий,
если есть -- работаюший вариант СКЛ-а...
...
Рейтинг: 0 / 0
Оптимизировать запрос
    #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
Оптимизировать запрос
    #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
Оптимизировать запрос
    #38405079
Фотография javajdbc
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
2. более приличные подход будет
сделать репорт с переменными датами:
напромер динамически генерировать на клиенете,
в процедуре, или может VIEW сделать, хотя
может быть медлено.

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

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

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

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

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

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

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


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