首页 > 解决方案 > 从行中获取唯一值,否则在 SQL 中采用默认值

问题描述

我有一个销售行列表,每个销售行都有一个货币字段。销售行由表 SALE_LINE 表示,该表有一个字段 Currency,用于存储销售行的货币。

我想做一个 SQL 请求,它将获取销售线列表,如果这些销售线的货币对它们都是唯一的,则采用该货币或将值设置为默认值,如美元。

就像我有 3 行货币:EUR、GBP、ZAR,请求将返回 DOL。如果我有 3 行货币:欧元、欧元、欧元,请求将返回给我欧元。

我的 SQL 请求如下:

DECLARE
    @salesLineIds VARCHAR(MAX),
    @defaultCurrency VARCHAR(10),
    @uniqueCurrency VARCHAR(10)

SET @salesLineIds = '1,2,3';
SET defaultCurrency = 'DOL';

DECLARE
    @ID_LIST table (Id BIGINT)
    
INSERT INTO @ID_LIST SELECT TRY_CAST(value AS BIGINT)
FROM STRING_SPLIT(@salesLineIds, ',')

SELECT @uniqueCurrency =(CASE WHEN 1 = (SELECT COUNT(DISTINCT SL.Currency))
THEN 
    (SELECT DISTINCT SL_CUR.Currency
    from SALE_LINE SL_CUR
    where SL_CUR.Id in (SELECT * FROM @ID_LIST)
    )
ELSE 
    @defaultCurrency
END)
FROM SALE_LINE SL
WHERE SL.Id IN (SELECT * FROM @ID_LIST)

以上工作,但它可能不是很好的表现。有什么方法可以提高上述查询的性能吗?

下面的查询没有给出好的货币:

SELECT @uniqueCurrency =(CASE WHEN 1 = (SELECT COUNT(DISTINCT SL.Currency))
THEN 
    (SELECT DISTINCT SL.Currency
    )
ELSE 
    @defaultCurrency
END)
FROM SALE_LINE SL
WHERE SL.Id IN (SELECT * FROM @ID_LIST)
group by SL.Currency

任何关于我如何在工作 SQL 中做得更好的帮助将不胜感激。谢谢

标签: sqlsql-server

解决方案


假设没有空值。

SELECT
    CASE WHEN min(SL.Currency) = max(SL.Currency)
        THEN min(SL.Currency)
        ELSE @defaultCurrency
    END
FROM SALE_LINE SL
WHERE SL.Id IN (SELECT * FROM @ID_LIST);

推荐阅读