Sql 基于第二列值对列中的不同行求和

Sql 基于第二列值对列中的不同行求和,sql,sql-server,Sql,Sql Server,我有一个订单表(简化) 我正试图在此表上创建一个报告,我希望得到如下结果: SalesPersonId TotalCAD TotalUSD 1 12,345.00 6,789.00 2 7,890.00 1,234.00 我不希望进行自连接(也许我过早地进行了优化,但这似乎效率低下),即: 但是我想不出其他方法来做这件事,有什么想法吗?试试这个: SELECT SalesPersonId, SUM(CA

我有一个订单表(简化)

我正试图在此表上创建一个报告,我希望得到如下结果:

SalesPersonId   TotalCAD    TotalUSD
1               12,345.00   6,789.00
2               7,890.00    1,234.00
我不希望进行自连接(也许我过早地进行了优化,但这似乎效率低下),即:

但是我想不出其他方法来做这件事,有什么想法吗?

试试这个:

SELECT SalesPersonId, 
       SUM(CASE WHEN CurrencyID = 1 THEN SaleAmount ELSE 0 END) as CAD, 
       SUM(CASE WHEN CurrencyID = 2 THEN SaleAmount ELSE 0 END) as USD
FROM ORDERS
使用案例块:

SELECT
  SalesPersonId,
  SUM(
    CASE CurrencyID
      WHEN 1 THEN SaleAmount
      ELSE 0
    END
  ) AS TotalCAD,
  SUM(
    CASE CurrencyID
      WHEN 2 THEN SaleAmount
      ELSE 0
    END
  ) AS TotalUSD
FROM Orders
GROUP BY SalesPersonId

考虑试用标量值函数(SQL Server 2000或更高版本)

然后执行类似这样的SQL以获得结果(假设您也有一个单独的Salesors表,或者使用SELECT DISTINCT SALERSONID….FROM Orders):


一定要运行查询计划,看看它与此处建议的其他可能性相比是否符合您的需要,尤其是在处理大量数据的情况下。

简直太棒了。一段时间以来我一直想知道如何做到这一点。谢谢
SELECT SalesPersonId, 
       SUM(CASE WHEN CurrencyID = 1 THEN SaleAmount ELSE 0 END) as CAD, 
       SUM(CASE WHEN CurrencyID = 2 THEN SaleAmount ELSE 0 END) as USD
FROM ORDERS
SELECT
  SalesPersonId,
  SUM(
    CASE CurrencyID
      WHEN 1 THEN SaleAmount
      ELSE 0
    END
  ) AS TotalCAD,
  SUM(
    CASE CurrencyID
      WHEN 2 THEN SaleAmount
      ELSE 0
    END
  ) AS TotalUSD
FROM Orders
GROUP BY SalesPersonId
CREATE FUNCTION dbo.GetOrdersSumByCurrency
(   
    @SalesPersonID INT, @CurrencyID INT 
)
RETURNS DECIMAL(10, 2) 
AS
BEGIN
    DECLARE @Sum DECIMAL(10, 2) 

    SELECT @Sum = ISNULL(SUM(SalesAmount), 0) FROM dbo.Orders 
    WHERE SalespersonID=@SalesPersonID AND CurrencyID = @CurrencyID

    RETURN @Sum

END
    SELECT SalesPersonId, 
dbo.GetOrdersSumByCurrency(SalesPersonId, 1) AS SumUSD, dbo.GetOrdersSumByCurrency(SalesPersonId, 2) AS SumCAD 
    FROM SalesPersons