Я работаю над проектом, в котором я хочу использовать Case для расчета цены продукта под определенным номером Reference на сервере SQL. Ниже мой запрос Sql
SELECT
product AS Products,
refNum AS Refrence,
COUNT(id) AS Count
FROM ProductPriceList
GROUP BY
refNum, product
Выполняя вышеуказанный запрос, я получаю:
Product Reference Count
Product1 Ref08 24
Product2 Ref08 7
Product3 Ref07 32
Product2 Ref12 1
Product3 Ref12 18
Product1 Ref07 76
Product1 Null 56
Может ли кто-нибудь рассказать мне, как использовать оператор Case в запросе Sql с оператором group by, чтобы показать цену. Ниже приведен случай:
if count < 10 then price 1
if count > 10 and < 100 then price 2
if count > 100 then price 3
Я не хочу добавлять новую таблицу в свою базу данных. Надеюсь, вы понимаете мой вопрос.
Заранее спасибо.


Я думаю, что базовое выражение CASE может удовлетворить ваши требования:
SELECT
product AS Products,
refNum AS Refrence,
CASE WHEN COUNT(*) < 10 THEN 1
WHEN COUNT(*) >= 10 AND COUNT(*) < 100 THEN 2
ELSE 3 END AS price
FROM ProductPriceList
GROUP BY
product, refNum;
Здесь особо нечего объяснять, за исключением того, что в ценовом случае 2 используется граница, которая включает равна 10 (так как ценовой случай 1 исключает его).
Спасибо, он работает, но я забыл добавить одну вещь, то есть продукт без refNum null, я отредактировал свой код выше
@PankashMann Обычно NULL обрабатывается как любое другое значение при группировке. Я не вижу проблемы. Возможно, вы можете добавить в свой вопрос образец данных, который посвящен этому вопросу.
Вот альтернатива (хотя и не сильно отличается от существующей):
Вы можете использовать свой запрос в подзапросе и использовать case вне:
select product,
--to get NULL values back
case Reference when 'RefNull' then NULL else Reference end [Reference],
case when [Count] < 10 then 1
when [Count] between 10 and 100 then 2
else 3 end [price]
from (
SELECT product AS Products,
--to allow also null values to be grouped
coalesce(refNum, 'RefNull') AS Refrence,
COUNT(id) AS Count
FROM ProductPriceList
GROUP BY coalesce(refNum, 'RefNull'), product
) [a]
Спасибо, он работает, но я забыл добавить одну вещь, то есть продукт без refNum null, я отредактировал свой код выше
@PankashMann Обычно группа по исключает значения NULL. См. Мой обновленный запрос.
не хотите группировать нулевое значение, отредактированный запрос показывает тот же результат, что и предыдущий
@PankashMann Я думаю, ты понимаешь, что ты сказал. Я снова обновил запрос, в нем была ошибка :)
Набор данных:
Create Table ProductPriceList
(
Product varchar(10)
,RefNum CHAR(5)
,Records Int
);
Insert into ProductPriceList
Values
('Product1','Ref08',24)
,('Product2','Ref08',7)
,('Product3','Ref07',32)
,('Product2','Ref12',1)
,('Product3','Ref12',18)
,('Product1','Ref07',76)
,('Product1', NULL, 56);
With RCTE AS
(
Select Product
,RefNum
,Records
,1 RowNo
From ProductPriceList PPL
Union All
Select Product
,RefNum
,Records
,RowNo + 1
From RCTE R
Where RowNo + 1 < Records
)
Insert Into ProductPriceList (Product, RefNum, Records)
Select Product, RefNum, Records
From RCTE
where Records > 1
Запрос для получения желаемого результата:
Select Product
,RefNum
,Case When Count(*) < 10 Then 1
When Count(*) Between 10 and 99 then 2
Else 3 End Price
From ProductPriceList
Group By Product, RefNum
Вы сказали в комментарии ниже
don't want null value to be grouped. Тогда каков ваш ожидаемый результат?