Создать скрипт для обновления строки таблицы на основе деления двух элементов выбора из 4 связанных таблиц - PullRequest
0 голосов
/ 16 мая 2019

У меня 4 таблицы.

+----------------------+--------------+--------------+-----------+
| School               | Event        | SchoolStore  | Order     |
+----------------------+--------------+--------------+-----------+
| Id                   | Id           | SchoolId     | Id        |
| OrdersAverageNumber  | SchoolId     |              | EventId   |
|                      | IsDeleted    |              | Status    |
|                      | Status       |              | Date      |
|                      | Date         |              |           |
+----------------------+--------------+--------------+-----------+

отношение изображения https://ibb.co/gwJ8QkM

Моя цель - вставить ordersAverageNumber в каждую школу

значение должно быть

(Общая сумма всех заказов со статусом = 1 и за период startDate - endDate)

делится на

(Общая сумма всех событий со статусом = 1 и IsDeleted = 0 для периода startDate - endDate)

Я пытался выбрать данные в соответствии с указанными критериями, но мне очень сложно все объединить.

Здесь я попытался разделить два выбора

select ((select count(*) 
        from [Order]
        where(OrderStatus = 1 AND CreatedDate >= @startDate AND CreatedDate <= @endDate))
        /
       (SELECT Count(*)
        FROM [Event]
        WHERE ("IsDeleted" = 0 AND "Status" = 1 AND "Date" >= @startDate AND "Date" <= @endDate)))

Здесь я попытался запросить связанные данные таблицы

select distinct s.OrdersAverageNumber, evn.Id, evn.Status, evn.Date, evn.IsDeleted, ord.Id, ord.CreatedDate, ord.OrderStatus
from [School] s
join [SchoolStore] ss on s.Id = ss.SchoolId
join [Event] evn on evn.SchoolId = ss.SchoolId
join [Order] ord on ord.EventId = evn.Id
where(evn.IsDeleted = 0 
  AND evn.Status = 1
   AND evn.Date >= @startDate 
  AND evn.Date <= @endDate 
  AND ord.OrderStatus = 1 
  AND ord.CreatedDate >= @startDate 
  AND ord.CreatedDate <= @endDate)
order by ord.CreatedDate desc

Основная проблема для меня - представить, как выполнить этот запрос для всех школ, разделить эти два выбора из связанных таблиц.

1 Ответ

0 голосов
/ 16 мая 2019

Соединение влево event и order до school, затем группировка по школе и получение различного количества идентификаторов событий и заказов. Если для школы нет событий или заказов, счет будет 0, поскольку count() не считается NULL с. Чтобы избежать деления на ноль ошибок, используйте выражение CASE, которое делится только тогда, когда число событий не равно NULL.

SELECT s.id,
       CASE
         WHEN count(DISTINCT e.id) <> 0 THEN
           count(DISTINCT o.id) / count(DISTINCT e.id)
       END ordersaveragenumber
       FROM school s
            LEFT JOIN event e
                      ON e.schoolid = s.id
                         AND e.isdeleted = 0
                         AND e.status = 1
                         AND e.date >= @startDate
                         AND e.date <= @endDate
            LEFT JOIN order o
                      ON o.eventid = e.id
                         AND o.orderstatus = 1
                         AND o.createddate >= @startDate
                         AND o.createddate <= @endDate
       GROUP BY s.id;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...