Суммирование другой строки в столбце на основе значения второго столбца - PullRequest
2 голосов
/ 01 мая 2009

У меня есть таблица заказов (упрощенно)

OrderId,
SalesPersonId,
SaleAmount,
CurrencyId,
...

Я пытаюсь создать отчет по этой таблице, надеюсь что-то вроде:

SalesPersonId   TotalCAD    TotalUSD
1               12,345.00   6,789.00
2               7,890.00    1,234.00

Я бы предпочел не делать самостоятельное объединение (возможно, я оптимизирую преждевременно, но это кажется неэффективным) IE:

SELECT SalesPersonId, SUM(OrdersCAD.SaleAmount), SUM(OrderUSD.SaleAmount)
FROM Orders
    LEFT JOIN Orders AS OrdersCAD ON Orders.OrderID AND Orders.CurrencyID = 1
    LEFT JOIN Orders AS OrdersUSD ON Orders.OrderID AND Orders.CurrencyID = 2

Но я не могу придумать другого способа сделать это, какие-либо идеи?

Ответы [ 3 ]

8 голосов
/ 01 мая 2009

Использовать блок CASE:

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
2 голосов
/ 01 мая 2009

Попробуйте:

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
0 голосов
/ 02 мая 2009

Попробуйте попробовать скалярную функцию (SQL Server 2000 или более поздняя версия).

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

Затем выполните SQL, такой как этот, чтобы получить результаты (предполагается, что у вас есть отдельная таблица продавцов, или используйте вместо этого SELECT DISTINCT SalesPersonId .... FROM Orders):

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

Обязательно запустите планы запросов, чтобы увидеть, работает ли он так, как вам нужно, по сравнению с другими возможностями, предлагаемыми здесь, особенно если вы обрабатываете большое количество данных.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...