Альтернатива описанию СЛУЧАЯ для сравнения и обобщения данных

#sql

Вопрос:

У меня есть база данных, которая выглядит следующим образом;

 -------------------------------- region | price_a | price_b -------------------------------- USA | 100 | 120 USA | 150 | 150 Canada | 300 | 300 Mexico | 20 | 25  

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

Требуемые Результаты

 -------------------------------- region | price_match | price_mismatch -------------------------------- USA | 1 | 1 Canada | 1 | 0 Mexico | 0 | 1  

Я могу сделать это с помощью нескольких операторов case (ниже), но мне интересно, есть ли лучший подход.

Текущий Код:

 SELECT  region,  COUNT(CASE WHEN price_a = price_b THEN 'match' END) AS price_match,  COUNT(CASE WHEN price_a != price_b THEN 'match' END) AS price_mismatch FROM  FOO GROUP BY region;   

Комментарии:

1. То, что у вас есть, может быть не самым коротким подходом, но это лучший подход.

2. Спасибо,Фил, я склонен согласиться. Я рад видеть ответы ниже. о чем я бы и не подумал.

Ответ №1:

Я предполагаю, что из ваших недавних вопросов вы используете Snowflake, и в этом случае вы можете использовать более компактный синтаксис. Я все еще думаю, что использование case expression лучше с точки зрения документации и переносимости;

 select region,   sum(iff(price_a=price_b,1,0)) price_match,  sum(iff(price_a=price_b,0,1)) price_mismatch from cte group by region;  

Ответ №2:

Вы можете использовать sum :

 select region, sum(price_a = price_b), sum(price_a != price_b)  from foo  group by region