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