#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