[英]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.