将GROUP BY / CASE与WHEN或IF一起使用

时间:2017-12-15 22:52:24

标签: sql if-statement group-by case case-when

注意:下面的编辑查询。

我希望根据两个标准对数据集进行分段:

  1. 如果客户在特定餐厅多于或少于4 txns
  2. 如果客户在该数据集中的所有其他餐厅多于或少于24 txns
  3. 我正在使用GROUP BY,CASE和WHEN或IF的组合。我不确定哪种方法最好,如果有的话?

    SELECT 
    COUNT(Customer) AS number_of_customers, 
    AVG (CASE WHEN ItemPrice LIKE '-%' THEN NULL
    WHEN ItemPrice LIKE '0%' THEN NULL
    ELSE CAST (ItemPrice AS FLOAT) END) AS avg_item_price, 
    COUNT(DISTINCT(ReceiptIDDesc)) AS number_of_orders, 
    SUM(CAST(ItemPrice AS FLOAT)) AS total_spend
    FROM Tacos
    WHERE NOT (PurchaseDate > '01/01/2016 12:00' OR '03/01/2016 12:00'< 
    PurchaseDate)
    GROUP BY
        CASE
            WHEN (COUNT('MerchantFamily' = %TacoTruck%)> 2) AND COUNT('MerchantFamily' != %TacoTruck%) >24)
                THEN 'Fanatic'
            WHEN (COUNT('MerchantFamily' = %TacoTruck%)> 2) AND COUNT('MerchantFamily' != %TacoTruck%) <24)
                THEN 'Loyalist'
            WHEN (COUNT('MerchantFamily' = %TacoTruck%)< 2) AND COUNT('MerchantFamily' != %TacoTruck%) <24)
                THEN 'Seldom'
            ELSE
                'Potential'    
        END
    

    OR

    GROUP BY
        CASE
            IF(COUNT(IF( 'MerchantFamily' = 'TacoTruck', 1, 0 ) ) > 2, TRUE, FALSE)
            AND 
            IF(COUNT(IF( 'MerchantFamily' != 'TacoTruck',1, 0) ) < 24, TRUE, FALSE), 'Loyalist', NULL )
            IF(COUNT(IF( 'MerchantFamily' = 'TacoTruck', 1, 0 ) ) > 2, TRUE, FALSE) 
            AND
            IF(COUNT(IF( 'MerchantFamily' != 'TacoTruck', 1, 0 ) ) > 24, TRUE, FALSE), 'Fanatic', NULL) 
            IF(COUNT(IF( 'MerchantFamily' = 'TacoTruck', 1, 0 ) ) < 2, TRUE, FALSE) 
            AND
            IF(COUNT( IF( 'MerchantFamily' != 'TacoTruck', 1, 0 ) ) < 24, TRUE, FALSE), 'Seldom', NULL) 
        ELSE
            'Potential'
    END
    

1 个答案:

答案 0 :(得分:1)

这些方法都不起作用,您需要先进行分组,然后通过having子句考虑聚合计数值,或者作为嵌套子查询(&#34; derived table&#34;)

case expression仅评估每行的值,不会扫描多行。