繁体   English   中英

从行中获取唯一值其他在 SQL 中采用默认值

[英]Get unique value from lines else take default value in SQL

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

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

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

我的 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 中做得更好的帮助将不胜感激。 谢谢

您需要对整个集合进行分组,然后只需检查不同的Currency值。 如果只有一个,那么您可以使用任何聚合(例如MIN )来获取它。

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 COUNT(DISTINCT SL.Currency) = 1
    THEN MIN(SL.Currency)
    ELSE @defaultCurrency
  END
FROM SALE_LINE SL
WHERE SL.Id IN (SELECT * FROM @ID_LIST);

我建议CHAR(3)作为货币的合适数据类型

假设没有空值。

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);

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM