#sql-server
#sql-сервер
Вопрос:
У меня есть настроенный запрос, который просматривает таблицу заказов и получает список отсутствующих последовательных номеров заказов, поэтому мы можем использовать этот список для отслеживания отсутствующих заказов.
Кажется, он работает нормально, за исключением того, что я получаю только первое число, если их несколько подряд.
Итак, если результат должен быть: 1,5,6,10, я вместо этого получаю: 1,5,10 6 не учитывается
Я не мастер SQL, и я не совсем понимаю, что нужно изменить в коде, чтобы убедиться, что я получу их все. Вот код, который у меня есть:
DECLARE @maxorder INT
SET @maxorder = (SELECT MAX(CAST(TranNo) AS INT)
FROM SalesOrder
WHERE TranDate
BETWEEN getdate()-1 AND DATEADD(DAY, 1, GETDATE()))
SELECT a.offset AS Missing
FROM
(SELECT 1 AS Offset
UNION
SELECT CAST((TranNo) AS INT) 1
FROM SalesOrder
WHERE TranDate BETWEEN GETDATE()-1 AND DATEADD(DAY, 1, GETDATE())) a
LEFT JOIN
(SELECT CAST((TranNo) AS INT) AS TranNum
FROM SalesOrder
WHERE TranDate BETWEEN getdate()-1 AND DATEADD(DAY, 1, GETDATE())) b
ON a.offset = b.trannum
WHERE
a.offset > 1
AND b.trannum IS NULL
AND a.offset < @maxorder
ORDER BY Missing
Заранее спасибо!
Комментарии:
1. Какая версия SQL? В более поздних версиях есть несколько очень простых способов решить эту проблему.
2. Также были бы полезны некоторые примеры данных, а также то, что вы ожидаете увидеть на основе этих данных.
3. Получить минимальное и максимальное число. Заполните временную таблицу всем диапазоном. Затем влево / вправо соедините два с условием null для ваших данных. Вы увидите все отсутствующие записи
4. Примерные данные: ожидается 86092, 86094, 86101: 86092, 86094, 86095, 86096, 86101
5. ТС, я не уверен на 100%, как это сделать. Я не совсем профессионал в SQL. Я посмотрю, смогу ли я это выяснить. Спасибо, ребята.
Ответ №1:
DECLARE @maxorder INT, @counter INT = 1 --Set this to your lower bound for SalesOrder table
SELECT @maxorder = MAX(CAST(TranNo AS INT))
FROM SalesOrder
CREATE TABLE #temp (TranNum INT)
WHILE @counter <= @maxorder
BEGIN
INSERT INTO #temp (TranNum) values (@counter)
END
SELECT t.TranNum
FROM #temp t
LEFT OUTER JOIN SalesOrder s ON t.TranNum = CAST(s.TranNo AS INT)
WHERE s.TranNo is null
ORDER BY t.TranNum
Комментарии:
1. Спасибо. Это заставило меня приступить к устранению проблемы. Я ценю это! Я использовал табличную переменную вместо временной таблицы, добавил и переместил несколько вещей, и это работает как шарм. Потрясающе!