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

Using GROUP BY/CASE with WHEN or IF

注意:已编辑以下查询。

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

  1. 如果客户在特定餐厅多于或少于 4 个交易
  2. 如果客户在该数据集中的所有其他餐厅有 多于或少于 24 笔交易

我正在使用 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

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

这些方法都行不通,您需要先分组,然后通过 having 子句或嵌套子查询 ("derived table") 考虑聚合计数值。

A case expression 仅计算每行的值,它不会扫描多行。