Случай в группе Sql по запросу

Я работаю над проектом, в котором я хочу использовать 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

Я не хочу добавлять новую таблицу в свою базу данных. Надеюсь, вы понимаете мой вопрос.

Заранее спасибо.

Вы сказали в комментарии ниже don't want null value to be grouped. Тогда каков ваш ожидаемый результат?

Tim Biegeleisen 10.05.2018 17:08
ReactJs | Supabase | Добавление данных в базу данных
ReactJs | Supabase | Добавление данных в базу данных
Это и есть ваш редактор таблиц в supabase.👇
Понимание Python и переход к SQL
Понимание Python и переход к SQL
Перед нами лабораторная работа по BloodOath:
1
1
199
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 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, я отредактировал свой код выше

Pankash Mann 10.05.2018 16:25

@PankashMann Обычно NULL обрабатывается как любое другое значение при группировке. Я не вижу проблемы. Возможно, вы можете добавить в свой вопрос образец данных, который посвящен этому вопросу.

Tim Biegeleisen 10.05.2018 16:45
Ответ принят как подходящий

Вот альтернатива (хотя и не сильно отличается от существующей):

Вы можете использовать свой запрос в подзапросе и использовать 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, я отредактировал свой код выше

Pankash Mann 10.05.2018 16:25

@PankashMann Обычно группа по исключает значения NULL. См. Мой обновленный запрос.

Michał Turczyn 10.05.2018 16:41

не хотите группировать нулевое значение, отредактированный запрос показывает тот же результат, что и предыдущий

Pankash Mann 10.05.2018 16:52

@PankashMann Я думаю, ты понимаешь, что ты сказал. Я снова обновил запрос, в нем была ошибка :)

Michał Turczyn 10.05.2018 17:01

Набор данных:

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

SQL Fiddle

Другие вопросы по теме