|
|
|
Требуется помощь в написании/улучшении sql-запроса
|
|||
|---|---|---|---|
|
#18+
Задача: нужно написать запрос, позволяющий выявить туристические агентства "Использующие систему для бронирования гостиниц под визы." Выдачу в запросе нужно оформить таким образом: 1) Название турагентства 2) ссылка на агентство - http://online-express.ru/office/agencies/2 3) Количество заказов всего 4) Количество заказов аннулировано 5) Процент аннуляции = (Количество заказов аннулировано)/(Количество заказов всего)*100 Критерии который должны быть в запросе: - Период времени "с" - "по" (дата создания заказа) - Не учитывать агентства с менее чем "заказов всего" - числовое значение. Чтобы отсечь агентства , сделавшие 0-1-2-3.... заказа за этот период, они могли действительно аннулироваться. - Не учитывать заблокированные агентства. Чтобы можно было блокировать хулиганов и они не мешались в выборке. Что получилось и не получилось у меня реализовать: - получилось достать из базы необходимые данные, но все эти данные в одной большой "куче". Не могу сообразить как улучшить запрос, чтобы сгруппировать, подсчитать и оформить выдачу в запросе как описано выше. Код: 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. Как выглядит выдача запроса - приведена на рисунке: ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.05.2016, 12:48 |
|
||
|
Требуется помощь в написании/улучшении sql-запроса
|
|||
|---|---|---|---|
|
#18+
где agencies.enabled = 1 -- Не учитываются заблокированные агентства suppliersVisaSupport.support = 2 -- агентства использующие систему для бронирования гостиниц под визы (0 - не использует, 3 - виз. поддержка не нужна) bookings.status = 4 -- аннулированный заказ (8 - заказ поддтверждён, 3 - отменённый заказ) FROM_UNIXTIME(bookings.createTime) BETWEEN '2016-01-01' and '2016-05-31' -- Период времени "с" - "по" (дата создания заказа) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.05.2016, 12:52 |
|
||
|
Требуется помощь в написании/улучшении sql-запроса
|
|||
|---|---|---|---|
|
#18+
Появились сомнения, что возможно задуманное нельзя реализовать одним запросом. Очень нужна помощь. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.05.2016, 15:39 |
|
||
|
Требуется помощь в написании/улучшении sql-запроса
|
|||
|---|---|---|---|
|
#18+
okuznetsov1) Название турагентства 2) ссылка на агентство - http://online-express.ru/office/agencies/2 3) Количество заказов всего 4) Количество заказов аннулировано 5) Процент аннуляции = (Количество заказов аннулировано)/(Количество заказов всего)*100 Критерии который должны быть в запросе: а) Период времени "с" - "по" (дата создания заказа) б) Не учитывать агентства с менее чем "заказов всего" - числовое значение. Чтобы отсечь агентства , сделавшие 0-1-2-3.... заказа за этот период, они могли действительно аннулироваться. в) Не учитывать заблокированные агентства. Чтобы можно было блокировать хулиганов и они не мешались в выборке. 1,2 - указать в GROUP BY 3,4,5 - COUNT а,в - WHERE б - HAVING ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 31.05.2016, 16:31 |
|
||
|
Требуется помощь в написании/улучшении sql-запроса
|
|||
|---|---|---|---|
|
#18+
Cygapb-007, Не понимаю как вы предлагаете count-ами в одном запросе одновременно подсчитать и "Количество заказов всего" и "Количество заказов аннулировано", т.к. bookings.status = 4 - это аннулированный заказ (8 - заказ поддтверждён, 3 - отменённый заказ). Из этого следует, что общее кол-во заказов (и аннулиров., подтвержд. и отмененных) можно подсчитать: добавив как вы написали в селект count(agencies.`id`) as 'Кол-во заказов всего' и GROUP BY agencies.`name`, agenciesUrl. А вот что делать с "Количество заказов аннулировано" не понял? Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2016, 08:12 |
|
||
|
Требуется помощь в написании/улучшении sql-запроса
|
|||
|---|---|---|---|
|
#18+
okuznetsovCygapb-007, Не понимаю как вы предлагаете count-ами в одном запросе одновременно подсчитать и "Количество заказов всего" и "Количество заказов аннулировано", т.к. bookings.status = 4 - это аннулированный заказ (8 - заказ поддтверждён, 3 - отменённый заказ). Если значения разных статусов нужно раскидать по разным колонкам, то это легко делается через CASE | IF. Как вариант реализации "кросс-таба"/pivot-a ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2016, 08:25 |
|
||
|
Требуется помощь в написании/улучшении sql-запроса
|
|||
|---|---|---|---|
|
#18+
okuznetsovbookings.status = 4 - это аннулированный заказ (8 - заказ поддтверждён, 3 - отменённый заказ). что делать с "Количество заказов аннулировано" не понял? COUNT(*) все равно, что SUM(1) для MySQL можно написать еще проще: `Количество заказов аннулировано`=SUM(bookings.status = 4) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2016, 11:33 |
|
||
|
Требуется помощь в написании/улучшении sql-запроса
|
|||
|---|---|---|---|
|
#18+
Вот что получилось: - удалось вывести в отдельном столбце не только подсчитанное кол-во аннулированных заказов, но также и "отказанных", "подтвержденных" и "ожидающих подтверждения". Что требуется улучшить: - удалось подсчитать "кол-во заказов всего" для каждого турагентства, но как видно из прикрепленного рисунка (см. столбец "Кол-во заказов всего") - не совсем тот подсчёт который требуется и хотелось бы увидеть. Не знаю возможно ли в данном случае, но требуется подсчитать так: на примере турагенства "Витал Форс", т.е. сейчас в табл. три записи этого агентства, в колонке "Кол-во заказов всего" подсчитано: 1, 2 и 3 (числа правильно подсчитаны), нужно сделать чтобы была колонка или строка в которой будет вычисляться 1+2+3 = 6. В общем нужно суммировать записи в колонке "Кол-во заказов всего" для одних и техже турагентств. Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2016, 13:22 |
|
||
|
Требуется помощь в написании/улучшении sql-запроса
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2016, 13:24 |
|
||
|
Требуется помощь в написании/улучшении sql-запроса
|
|||
|---|---|---|---|
|
#18+
okuznetsovЧто требуется улучшить: - удалось подсчитать "кол-во заказов всего" для каждого турагентства, но как видно из прикрепленного рисунка (см. столбец "Кол-во заказов всего") - не совсем тот подсчёт который требуется и хотелось бы увидеть. Не знаю возможно ли в данном случае, но требуется подсчитать так: на примере турагенства "Витал Форс", т.е. сейчас в табл. три записи этого агентства, в колонке "Кол-во заказов всего" подсчитано: 1, 2 и 3 (числа правильно подсчитаны), нужно сделать чтобы была колонка или строка в которой будет вычисляться 1+2+3 = 6. В общем нужно суммировать записи в колонке "Кол-во заказов всего" для одних и техже турагентств. Код: 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. убери из секции GROUP BY поле bookings.status, в Select-листе добавь count(DISTINCT bookings.orderId) as Total. Наслаждайся полученным результатом ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2016, 13:38 |
|
||
|
Требуется помощь в написании/улучшении sql-запроса
|
|||
|---|---|---|---|
|
#18+
Добрый Э - ЭхokuznetsovЧто требуется улучшить: - удалось подсчитать "кол-во заказов всего" для каждого турагентства, но как видно из прикрепленного рисунка (см. столбец "Кол-во заказов всего") - не совсем тот подсчёт который требуется и хотелось бы увидеть. Не знаю возможно ли в данном случае, но требуется подсчитать так: на примере турагенства "Витал Форс", т.е. сейчас в табл. три записи этого агентства, в колонке "Кол-во заказов всего" подсчитано: 1, 2 и 3 (числа правильно подсчитаны), нужно сделать чтобы была колонка или строка в которой будет вычисляться 1+2+3 = 6. В общем нужно суммировать записи в колонке "Кол-во заказов всего" для одних и техже турагентств. Код: 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. убери из секции GROUP BY поле bookings.status, в Select-листе добавь count(DISTINCT bookings.orderId) as Total. Наслаждайся полученным результатом ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2016, 13:39 |
|
||
|
Требуется помощь в написании/улучшении sql-запроса
|
|||
|---|---|---|---|
|
#18+
Разумеется пробовал так делать перед тем как спрашивать здесь. Убрать из секции GROUP BY поле bookings.status - нельзя, т.к. перестает вычисляться правильно колонка "кол-во аннулированных заказов" (statusCancelled), но также перестают вычисляться и другие поля: "отказанные" (statusRejected), "подтвержденные" (statusConfirmed) и "ожидающие подтверждения" (statusAwaitingResponse). Предполагаю, что скорее всего нужно как-то по другому подсчитывать сумму аннулированных заказов по каждому турагентству. подскажите куда копать? По поводу: Select-листе добавь count(DISTINCT bookings.orderId) as Total: см, эта конструкция уже добавлена ранее) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2016, 15:04 |
|
||
|
Требуется помощь в написании/улучшении sql-запроса
|
|||
|---|---|---|---|
|
#18+
okuznetsovВот что получилось: Код: 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. Выделенное неверно в принципе, потому что условие применяется ПОСЛЕ группировки. должно быть Код: sql 1. 2. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2016, 15:37 |
|
||
|
Требуется помощь в написании/улучшении sql-запроса
|
|||
|---|---|---|---|
|
#18+
опс... Не увидел группировку по bookings.status... Сорь ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2016, 15:42 |
|
||
|
Требуется помощь в написании/улучшении sql-запроса
|
|||
|---|---|---|---|
|
#18+
... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 01.06.2016, 15:43 |
|
||
|
Требуется помощь в написании/улучшении sql-запроса
|
|||
|---|---|---|---|
|
#18+
Спасибо, работает как нужно. Получившийся запрос: Код: 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. ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2016, 07:32 |
|
||
|
Требуется помощь в написании/улучшении sql-запроса
|
|||
|---|---|---|---|
|
#18+
okuznetsovСпасибо, работает как нужно. Получившийся запрос: Код: 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. выделенное красным противоречит группировке по AGENCIES (т.к. suppliersVisaSupport зависит от сворачиваемых при группировке bookings, то есть тоже будет свернут. Какое при этом будет взято одиночное значение - предсказать невозможно) Наверное, лучше написать MAX(IF( suppliersVisaSupport.support=2,"Да",null)) А выделенное желтым заблокирует индекс по bookings.createTime (если он есть) ... |
|||
|
:
Нравится:
Не нравится:
|
|||
| 02.06.2016, 14:02 |
|
||
|
|

start [/forum/topic.php?fid=47&msg=39247057&tid=1831712]: |
0ms |
get settings: |
7ms |
get forum list: |
12ms |
check forum access: |
3ms |
check topic access: |
3ms |
track hit: |
163ms |
get topic data: |
11ms |
get forum data: |
3ms |
get page messages: |
56ms |
get tp. blocked users: |
1ms |
| others: | 210ms |
| total: | 469ms |

| 0 / 0 |
