SQL SUM () для одного поля с другими полями для других условий (наиболее эффективный способ) - PullRequest
0 голосов
/ 06 сентября 2018

У меня есть хранимая процедура для получения общего количества заказов (в $$$) на определенную дату, и в то же время мне нужно узнать, сколько было транзакции наличными по сравнению с транзакцией кредитной карты. Существуют также другие типы транзакций (например, PayPal), но их не нужно возвращать (не спрашивайте меня, почему).

У меня есть два варианта: написать все в одном запросе или перейти через курсор. Вот мой 1 запрос

SELECT @TotalOrder = SUM([TotalValue]),
       @TotalCash = (SELECT SUM([TotalValue]) FROM [dbo].[tblOrder] dbChild WHERE (dbChild.[OrderId] = dbMain.[OrderId]) AND (dbChild.[PaymentType] = 0)),
       @TotalCard = (SELECT SUM([TotalValue]) FROM [dbo].[tblOrder] dbChild WHERE (dbChild.[OrderId] = dbMain.[OrderId]) AND (dbChild.[PaymentType] = 1))
FROM [dbo].[tblOrder] dbMain
WHERE [PaymentDate] BETWEEN @StartDate AND @EndDate;

В порядке ли запрос выше? Кроме того, я могу использовать курсор, который перебирает каждую запись и накапливает @TotalOrder, @TotalCash и @ TotalCard.

SELECT [TotalValue], [PaymentType]
FROM [dbo].[tblOrder] dbMain
WHERE [PaymentDate] BETWEEN @StartDate AND @EndDate;

--then use cursor to loop through each of the record.

Что ты думаешь? Какой из них наиболее эффективный? Если оба неэффективны, есть ли у вас какие-либо другие предложения?

1 Ответ

0 голосов
/ 06 сентября 2018

Первый метод, скорее всего, будет самым быстрым, однако вы можете выполнить рефакторинг для использования одного запроса:

SELECT @TotalOrder = SUM([TotalValue]),
       @TotalCash = SUM(CASE WHEN [PaymentType] = 0 THEN [TotalValue] ELSE 0 END)
       @TotalCard = SUM(CASE WHEN [PaymentType] = 1 THEN [TotalValue] ELSE 0 END)
FROM [dbo].[tblOrder] dbMain 
WHERE [PaymentDate] BETWEEN @StartDate AND @EndDate;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...