Sql 尝试改进查询

Sql 尝试改进查询,sql,sql-server,Sql,Sql Server,我需要从一家公司获得两种不同货币(美元和玻利维亚诺)的业务量。我在一个存储过程中进行了两次查询,结果都正常。我的问题是,我不知道如何在唯一查询中合并它们,因为它们几乎相同 SELECT @amount_dollars = ISNULL(SUM(Amount), 0.00) FROM ProcessBatches WHERE CompanyId = @company_id AND CONVERT(CHAR(8), DateProcess, 112) = @current_dat

我需要从一家公司获得两种不同货币(美元和玻利维亚诺)的业务量。我在一个存储过程中进行了两次查询,结果都正常。我的问题是,我不知道如何在唯一查询中合并它们,因为它们几乎相同

SELECT @amount_dollars = ISNULL(SUM(Amount), 0.00) 
FROM ProcessBatches
WHERE 
    CompanyId = @company_id
    AND CONVERT(CHAR(8), DateProcess, 112) = @current_date
    AND Currency = 'USD'
    AND OperationTypeId NOT IN (17,18)
    AND State IN ('P','W','N','A')

SELECT @amount_bols = ISNULL(SUM(Amount), 0.00)
FROM ProcessBatches
WHERE 
    CompanyId = @company_id
    AND CONVERT(CHAR(8), DateProcess, 112) = @current_date
    AND Currency = 'BOL'
    AND OperationTypeId NOT IN (17,18)
    AND State IN ('P','W','N','A')

我不是SQL方面的专家。提前感谢并为我的英语感到抱歉(我正在学习)

只需使用条件聚合:

SELECT @amount_dollars = COALESCE(SUM(CASE WHEN Currency = 'USD' THEN Amount END), 0.00) ,
       @amount_bols = COALESCE(SUM(CASE WHEN Currency = 'BOL' THEN Amount END), 0.00)          
FROM ProcessBatches
WHERE  CompanyId = @company_id AND
       CAST(DateProcess as date) = @current_date AND
       Currency IN ('BOL', 'USD') AND
       OperationTypeId NOT IN (17, 18) AND
       State IN ('P', 'W', 'N', 'A');

注意:我将
日期
比较更改为使用
日期
数据类型。这比使用字符串比较要好得多。另外,到日期的转换仍然允许使用索引(在SQL Server中)。

只需使用条件聚合:

SELECT @amount_dollars = COALESCE(SUM(CASE WHEN Currency = 'USD' THEN Amount END), 0.00) ,
       @amount_bols = COALESCE(SUM(CASE WHEN Currency = 'BOL' THEN Amount END), 0.00)          
FROM ProcessBatches
WHERE  CompanyId = @company_id AND
       CAST(DateProcess as date) = @current_date AND
       Currency IN ('BOL', 'USD') AND
       OperationTypeId NOT IN (17, 18) AND
       State IN ('P', 'W', 'N', 'A');

注意:我将
日期
比较更改为使用
日期
数据类型。这比使用字符串比较要好得多。另外,到日期的转换仍然允许使用索引(在SQL Server中)。

是的!,它起作用了。谢谢我不知道合并函数。@HéctorÁlvarez:“请避免在日期类型上放置索引”。为什么?@HéctorÁlvarez如果我能否决你的评论,我会的。为日期列编制索引是一种非常常见和有效的策略。无论数据类型如何,任何索引都有代价;你要平衡成本和收益。此外,索引中的任何列集通常都不是唯一的。在事务表的customerid上创建索引。这肯定不是唯一的——这是如何导致错误的?@HéctorÁlvarez。日期列不会“以指数方式增加索引大小”。与任何其他类型一样,每个值都会向索引中添加一条以上的记录(以说明B树的形状)。日期并不比其他类型的日期差或好。而且绝对没有要求索引的键是唯一的——否则世界上大多数索引都是无效的。是啊!,它起作用了。谢谢我不知道合并函数。@HéctorÁlvarez:“请避免在日期类型上放置索引”。为什么?@HéctorÁlvarez如果我能否决你的评论,我会的。为日期列编制索引是一种非常常见和有效的策略。无论数据类型如何,任何索引都有代价;你要平衡成本和收益。此外,索引中的任何列集通常都不是唯一的。在事务表的customerid上创建索引。这肯定不是唯一的——这是如何导致错误的?@HéctorÁlvarez。日期列不会“以指数方式增加索引大小”。与任何其他类型一样,每个值都会向索引中添加一条以上的记录(以说明B树的形状)。日期并不比其他类型的日期差或好。而且绝对没有要求索引的键是唯一的——否则世界上的大多数索引都是无效的。