sql - 从行中获取唯一值,否则在 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 中做得更好的帮助将不胜感激。谢谢
解决方案
假设没有空值。
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);
推荐阅读
- android - 如何将数据从 Fragment 发送到 Widget Provider?
- ios - 在 iOS 中显示键盘时无法滚动到视图底部
- python - 如何为带有 2 个独立笔记本的循环小部件?
- android - 如何使用 GSON 在 android 中将动态嵌套 JSON 转换为 JAVA 对象?
- java - 使用 jarsigner 重复条目 module-info.class 对 java 11 jar 进行签名
- boost - 使用从 brew 安装的 boost-python 和 boost 版本 1.59
- javascript - Google Cast Chrome Sender - 队列更改回调
- vue.js - 捕获父组件中子组件发出的事件的值
- javascript - 从 href 属性获取查询字符串参数
- windows - 通过 GSUTIL 将文件从 Windows 10 文件夹上传到 Gcloud 存储桶时出现问题