Как создать Sumif-подобную функцию в SQL с критерием, являющимся значением в каждой строке? - PullRequest
2 голосов
/ 06 июля 2019

Я знаком с Excel VBA, но только начал работать с SQL, используя SQLite Studio.У меня есть таблица, подобная следующей:

Customer_ID    Qty_Sold
Retail001      10    
Retail001      20  
Retail002      30   
Wholesale001   100  
Wholesale001   100   
Wholesale001   100
Wholesale002   200 
Wholesale003   500 
Wholesale003   600

, и я хочу классифицировать клиента по 3 категориям: розничная торговля, оптовая мелкая и оптовая крупная, с кол-во проданных более 1000, являющихся крупными оптовыми покупателями.Таким образом, желаемый результат выглядит следующим образом:

Customer_ID    Qty_Sold    Classification
Retail001      10          Retail
Retail001      20          Retail
Retail002      30          Retail
Wholesale001   100         Wholesale Small
Wholesale001   100         Wholesale Small
Wholesale001   100         Wholesale Small
Wholesale002   200         Wholesale Small
Wholesale003   500         Wholesale Large
Wholesale003   600         Wholesale Large

У меня проблема с использованием функции, подобной sumifs, для определения количества покупок каждого клиента.Поэтому в контексте Excel VBA я могу использовать для этого цикл For Next и операторы If Then, поэтому я могу написать, например:

WorksheetFunction.SumIfs(Range("B2:B9"), Range("A" & i), Range("A2:A9")) > 1000

, где i - счетчик в цикле.Тем не менее, в SQL я понимаю, что это трудно реализовать, поскольку идентификатор клиента не является жестко закодированной строкой, а динамически основан на разных строках.Вот некоторый код, который я пробовал:

Select customer_id, qty_sold,
Case
    When customer_id Like 'Wholesale&' And (...) > 1000 Then 'Wholesale Large'
    When customer_id Like 'Wholesale&' And (...) <= 1000 Then 'Wholesale Small'    
    Else 'Retail'
End As Classification
From Base_Table
;

Поскольку (...) часть - это то, где я не знаю, как писать.Я думаю, что это может быть что-то вроде:

Sum(Case When customer_id then qty_sold end) > 1000

, но я не знаю, как ссылаться на значение в каждой строке.

Ответы [ 2 ]

2 голосов
/ 06 июля 2019

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

Один из подходов к этому - объединить запрос к таблице с агрегированным запросом, а затем применить логику категоризации:

SELECT b.customer_id, 
       qty_sold,
       CASE
            WHEN b.customer_id LIKE 'Retail%' THEN 'Retail'
            WHEN b.customer_id LIKE 'Wholesale%' AND total > 1000 THEN 'Wholesale Large'
            WHEN b.customer_id LIKE 'Wholesale%' AND total <= 1000 THEN 'Wholesale Small'
            ELSE 'I don''t know'
       END AS classification
FROM   base_table b
JOIN   (SELECT   customer_id, SUM(qty_sold) AS total
        FROM     base_table
        GROUP BY customer_id) a ON b.customer_id = a.customer_id
1 голос
/ 06 июля 2019

Если вы используете современную версию sqlite (3.25 или новее), вы можете использовать оконные функции, чтобы сделать это довольно легко:

select customer_id, qty_sold,
       case when customer_id like 'retail%' then 'Retail'
            when sum(qty_sold) over (partition by customer_id) > 1000 then 'Wholesale Large'
            else 'Wholesale Small' end as classification
from base_table
order by customer_id, qty_sold;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...