Member 13613963 Ответов: 1

В результате мне нужно получить таблицу заказов


У меня есть таблица заказов, которая идет в эту сторону. Таблица содержит заказы, размещенные после 12 часов ночи в определенный день.

Ordername Orderplaced Ordercompleted

А 00:12:56 01:24:42
Б 01:15:20 01:45:30

Мне нужно получить количество обрабатываемых заказов за каждый 1-минутный интервал.
Количество должно быть 1 или больше только тогда, когда заказ находится в процессе обработки.В остальное время он должен быть равен 0


Мне нужен результат в таком виде :-

Ordertime count(заказы)
00:00 0
00:01 0
'
'
00:12 0
00:13 1
00:14 1
'
'
01:16 2
01:17 2
'
01:25 1
01:26 1
'
01:46 0

'
вплоть до настоящего времени, когда выполняется запрос.


Пожалуйста, предоставьте подходящее решение SQL (или PL/SQL).

Что я уже пробовал:

Я пробовал использовать union select, но это не дает мне желаемого результата .

OriginalGriff

Покажите нам запрос, который вы пробовали, и объясните, что он делает, чего не должен делать.
Используйте виджет "улучшить вопрос", чтобы отредактировать свой вопрос и предоставить более подробную информацию.

Richard Deeming

В дополнение к тому, чтобы показать нам, что вы уже пробовали, вам нужно будет рассказать нам, какую СУБД вы используете.

Вы отметили этот вопрос как "SQL-сервер" (сервер Microsoft SQL) и "MySQL". Затем в вопросе вы упомянули решение "PL/SQL", что означало бы, что вы используете Oracle. Это три разных продукта, и решение для одного из них, вероятно, не будет работать на других.

1 Ответов

Рейтинг:
1

Maciej Los

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

Шаги, которые нужно сделать:


  1. Создать TimeTable хранить каждый час и минуту дня (от '00:00' к '00:59').
    USE yourDatabaseName;
    
    CREATE TABLE TimeTable
    (
        StartTime TIME
    );

    Это нужно сделать только один раз!
    Чтобы полностью заполнить эту таблицу данными, используйте следующий запрос:
    ;WITH CteTimeTable AS
    (
    	SELECT CONVERT(TIME, '00:00:00') AS StartTime, CONVERT(TIME, '23:59:00') AS EndTime
    	UNION ALL
    	SELECT DATEADD(N, 1, StartTime), CONVERT(TIME, '23:59:00') AS EndTime
    	FROM CteTimeTable
    	WHERE DATEADD(N, 1, StartTime) <=EndTime 
    )
    INSERT INTO TimeTable(StartTime)
    SELECT StartTime 
    FROM CteTimeTable
    OPTION (MAXRECURSION 0)

  2. Теперь вы должны использовать общие табличные выражения (см. ссылки ниже) для разделения ордеров на минуты.
    Попробовать это:
    ;WITH OrigData AS
    (
    	SELECT 1 AS CntOfOrder, Ordername, CONVERT(TIME, LEFT(Orderplaced, 5)) AS StartTime, CONVERT(TIME, LEFT(Ordercompleted, 5)) As EndTime
    	FROM YourTable
    	UNION ALL
    	SELECT CntOfOrder, Ordername, DATEADD(N, 1, StartTime)  AS StartTime, EndTime
    	FROM OrigData 
    	WHERE DATEADD(N, 1, StartTime) <= EndTime 
    )
    SELECT StartTime, SUM(CntOfOrder) AS NoOfOrders
    FROM OrigData 
    GROUP BY StartTime

    Приведенный выше запрос возвращает сумму ордеров за каждую минуту каждого ордера, например:
    ....
    01:08:00.0000000	1
    01:09:00.0000000	1
    01:10:00.0000000	1
    01:11:00.0000000	1
    01:12:00.0000000	1
    01:13:00.0000000	1
    01:14:00.0000000	1
    01:15:00.0000000	2
    01:16:00.0000000	2
    01:17:00.0000000	2
    ....

  3. Наконец, вы должны присоединиться к обоим столам. Итак, замените последнее SELECT заявление с этим:
    SELECT L.StartTime, SUM(R.CntOfOrder)
    FROM TimeTable AS L LEFT JOIN OrigData AS R ON L.StartTime = R.StartTime
    GROUP BY L.StartTime



Для получения более подробной информации, пожалуйста, смотрите:
Использование Общих Табличных Выражений[^]
С common_table_expression (Transact-SQL) | Microsoft Docs[^]
Рекурсивные Запросы, Использующие Обобщенные Табличные Выражения[^]