You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何避免嵌套查询实现客户订单统计且无需展示D365_ID等多余字段

SQL查询优化方案

无嵌套直接实现方案

你可以将完整的CASE表达式直接放入GROUP BY子句,既不需要嵌套查询,也不需要返回多余的D365_ID、STORE_NAME字段,代码如下:

SELECT 
    CUSTOMER_EMAIL,
    SUM(line_price) AS VALUE_Total,
    COUNT(DISTINCT order_id) AS Orders_Total, 
    CASE 
        WHEN D365_ID = 'NORD' THEN 'EURO'
        WHEN D365_ID = 'US' THEN 'USD'
        WHEN D365_ID = 'UK' THEN 'GBP'
        WHEN D365_ID = 'LMG' THEN 'EURO'
        WHEN D365_ID = 'SWE' THEN 'SEK'     
        WHEN D365_ID = 'Unknown' THEN
            CASE 
                WHEN STORE_NAME LIKE 'DE%' THEN 'EURO'
                WHEN STORE_NAME LIKE 'SE EUR%' THEN 'EURO'
                WHEN STORE_NAME LIKE 'SE SEK%' THEN 'SEK'
                ELSE 'Unknown'
            END
        ELSE 'Unknown'
    END AS CURRENCY
FROM "CUSTOMER_TRANSACTIONS"
GROUP BY 
    CUSTOMER_EMAIL,
    CASE 
        WHEN D365_ID = 'NORD' THEN 'EURO'
        WHEN D365_ID = 'US' THEN 'USD'
        WHEN D365_ID = 'UK' THEN 'GBP'
        WHEN D365_ID = 'LMG' THEN 'EURO'
        WHEN D365_ID = 'SWE' THEN 'SEK'     
        WHEN D365_ID = 'Unknown' THEN
            CASE 
                WHEN STORE_NAME LIKE 'DE%' THEN 'EURO'
                WHEN STORE_NAME LIKE 'SE EUR%' THEN 'EURO'
                WHEN STORE_NAME LIKE 'SE SEK%' THEN 'SEK'
                ELSE 'Unknown'
            END
        ELSE 'Unknown'
    END

可选高可读性实现方案

如果觉得CASE表达式重复编写冗余,可以用CTE(公用表表达式)代替嵌套子查询,逻辑更清晰,目前主流MySQL、PostgreSQL、SQL Server、Oracle等数据库的优化器都会对该写法生成和无嵌套写法几乎一致的执行计划,性能差异可忽略:

WITH transaction_with_currency AS (
    SELECT 
        CUSTOMER_EMAIL,
        line_price,
        order_id,
        CASE 
            WHEN D365_ID = 'NORD' THEN 'EURO'
            WHEN D365_ID = 'US' THEN 'USD'
            WHEN D365_ID = 'UK' THEN 'GBP'
            WHEN D365_ID = 'LMG' THEN 'EURO'
            WHEN D365_ID = 'SWE' THEN 'SEK'     
            WHEN D365_ID = 'Unknown' THEN
                CASE 
                    WHEN STORE_NAME LIKE 'DE%' THEN 'EURO'
                    WHEN STORE_NAME LIKE 'SE EUR%' THEN 'EURO'
                    WHEN STORE_NAME LIKE 'SE SEK%' THEN 'SEK'
                    ELSE 'Unknown'
                END
            ELSE 'Unknown'
        END AS CURRENCY
    FROM "CUSTOMER_TRANSACTIONS"
)
SELECT 
    CUSTOMER_EMAIL,
    CURRENCY,
    SUM(line_price) AS VALUE_Total,
    COUNT(DISTINCT order_id) AS Orders_Total
FROM transaction_with_currency
GROUP BY CUSTOMER_EMAIL, CURRENCY

内容的提问来源于stack exchange,提问作者csharpvsto

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.29 04:18:03