2015-06-16 3 views
1

Застрял о том, как добиться следующего, мы считаем, что с либо IF/ELSE или CASE/КОГДА заявление:запросов SQL Server - Объяснение Ниже

У нас есть один пункт, со следующими свойствами.

Item = ABC 
Buy Quantity = 6 
Tolerance Quantity = 4 

Мы пытаемся выяснить, как рассчитать заряженное количество, следующее, как он будет работать

Ordered Quantity Charged Quantity 
1     1 
1.5     1.5 
3.83    3.83 
4     6 
5.54    6 
6     6 
7     7 
8.32    8.32 
9     9 
10     12 
11.9    12 
12     12 

Количество покупки составляет 6, а допустимое количество равно 4. Это означает, что, когда заказываемое количество становится в диапазоне 4-6, оно должно принимать количество покупки.

Если он не находится в этом диапазоне, он просто берет заказываемое количество.

Хитрая часть делает это, когда заказанное количество попадает в каждый «диапазон» Купить Количество (кратные 6 в этом примере):

6(4-6) 
12(10-12) 
18(16-18) 
24(22-24) 
and so on... 

Каждый элемент может иметь различные/Tolerance величины Купить.

Интересует ваше решение/совет.

Ниже создать оператор таблицы со значениями:

SET ANSI_NULLS ON 
GO 
SET QUOTED_IDENTIFIER ON 
GO 
CREATE TABLE [dbo].[StackQuestion](
    [OrderedQty] [numeric](19, 6) NULL 
) ON [PRIMARY] 

GO 
INSERT [dbo].[StackQuestion] ([OrderedQty]) VALUES (CAST(1.000000 AS Numeric(19, 6))) 
INSERT [dbo].[StackQuestion] ([OrderedQty]) VALUES (CAST(1.500000 AS Numeric(19, 6))) 
INSERT [dbo].[StackQuestion] ([OrderedQty]) VALUES (CAST(3.830000 AS Numeric(19, 6))) 
INSERT [dbo].[StackQuestion] ([OrderedQty]) VALUES (CAST(4.000000 AS Numeric(19, 6))) 
INSERT [dbo].[StackQuestion] ([OrderedQty]) VALUES (CAST(5.540000 AS Numeric(19, 6))) 
INSERT [dbo].[StackQuestion] ([OrderedQty]) VALUES (CAST(6.000000 AS Numeric(19, 6))) 
INSERT [dbo].[StackQuestion] ([OrderedQty]) VALUES (CAST(7.000000 AS Numeric(19, 6))) 
INSERT [dbo].[StackQuestion] ([OrderedQty]) VALUES (CAST(8.320000 AS Numeric(19, 6))) 
INSERT [dbo].[StackQuestion] ([OrderedQty]) VALUES (CAST(9.000000 AS Numeric(19, 6))) 
INSERT [dbo].[StackQuestion] ([OrderedQty]) VALUES (CAST(10.000000 AS Numeric(19, 6))) 
INSERT [dbo].[StackQuestion] ([OrderedQty]) VALUES (CAST(11.900000 AS Numeric(19, 6))) 
INSERT [dbo].[StackQuestion] ([OrderedQty]) VALUES (CAST(12.000000 AS Numeric(19, 6))) 

Работа запроса в соответствии с предложениями:

declare @BuyQuantity as numeric(19,6) 
declare @ToleranceQuantity as numeric(19,6) 

set @BuyQuantity = 6 
set @ToleranceQuantity = 4 

SELECT *, 
CASE 
WHEN OrderedQty >= @ToleranceQuantity AND OrderedQty <= @BuyQuantity THEN @BuyQuantity 
ELSE OrderedQty 
END AS ChargedQuantity 
FROM StackQuestion 

Как вы можете видеть в рабочем запросе, строки 10, 11 & 12 должен вернуться 10, 11,9 и 12. Как мы можем сделать их 12, 12 и 12?

+0

Как ваш вопрос связан с SQL вы добавили? Я вижу здесь только вычисление некоторой функции (количества), и ничего о sql. –

+0

Извините, но не смог понять «когда количество заказов попадает в каждый« диапазон »? –

+0

Энди, я отредактировал сообщение, думал, что IF/ELSE или CASE/WHEN для достижения желаемого результата. Dev D, я добавил дополнительный комментарий к предложению «диапазон», связанный с желаемым набором результатов, который я включил выше. – John

ответ

0

Вы можете рассчитать ChargedQuantity так:

CASE 
WHEN OrderedQuantity >= ToleranceQuantity AND OrderedQuantity <= BuyQuantity THEN BuyQuantity 
ELSE OrderedQuantity 
END AS ChargedQuantity 
+0

Спасибо Panayotis, но я не думаю, что это сработает, когда Ordered Quantity попадет в следующий «диапазон». Я попытаюсь, когда наступит момент, но если Ordered Quantity больше 6, не будет округляться до «диапазона», EG: (Если заказное количество равно 11, оно покажет 11 вместо 12). – John

0

определенно сазе встраивать в результатах SQL, в противном случае его тривиальным применить эту логику.

Ответ выше является правильным,

SELECT *, 
    CASE 
     WHEN OQ >= TolQ AND OQ <= BQ THEN BQ 
     ELSE OQ 
    END ChargedQty 
FROM table 
+0

Спасибо Крис, у меня есть добавил таблицу создания/значения и рабочий запрос с тем, чего я пытаюсь достичь. Любопытно, чтобы вы объяснили, почему это тривиально. – John

+0

Я не уверен, чего вы пытаетесь достичь.Определение таблицы и данные имеют только 1 столбец, поэтому я предполагаю, что вы хотите использовать Row_Number внутри оператора CASE? Я считаю утверждения IF довольно тривиальными, особенно для такого рода проблем. Выданные предложения CASE также довольно тривиальны, но, очевидно, мы где-то упускаем точку! –

+0

Спасибо Крису, возможно, Row_Number можно использовать. Я подумаю об этом. Я попытаюсь посмотреть, могу ли я упростить вопрос. – John

Смежные вопросы