Skip to content
Advertisement

Alternative to CASE Statement to Compare and Summarize Data

I have a database that looks like the following;

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

I need to compare the values from each price column and count the matched and mismatched prices and summarize as follows:

Required Results

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

I can do this via multiple case statements (below) but I’m wondering if there is a better approach.

Current Code:

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;

Advertisement

Answer

I am guessing from your recent questions, you’re using Snowflake, in which case you can use a more compact syntax. I still think using case expression is better from a documentation and portability standpoint;

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;
User contributions licensed under: CC BY-SA
7 People found this is helpful
Advertisement