Вопрос по пользовательской функции SQL - PullRequest
1 голос
/ 23 октября 2009

У меня проблемы с настройкой моей пользовательской функции. Я работаю на SQL Server 2000.

Я пытаюсь вернуть таблицу всех пользователей с равным балансом в таблице "BillingTransactions". Наши транзакции указываются в поле RecordType; 0 для покупки, 1 для оплаты. Поэтому я пытаюсь получить список всех пользователей, в которых сумма каждой транзакции с RecordType 0 равна сумме каждой транзакции с RecordType 1. Вот как теперь выглядит внутренняя часть моей функции:

    SELECT DISTINCT UserName FROM BillingTransactions
WHERE (SELECT SUM(AMOUNT) 
    FROM BillingTransactions 
    WHERE [BillingTransactions].[RecordType]= 0 
    AND  
    [BillingTransactions].[UserName]= UserName) 
    =
    (SELECT SUM(AMOUNT) 
    FROM BillingTransactions 
    WHERE [BillingTransactions].[RecordType]= 1 
    AND  
    [BillingTransactions].[UserName]= UserName)

У меня такое чувство, что это не самый эффективный способ сделать это ... Есть ли другой способ увидеть, как это сделать? Спасибо!

Ответы [ 2 ]

11 голосов
/ 23 октября 2009

Как и в любом запросе SQL, эффективность будет зависеть от фактического расположения ваших данных (структура таблицы, структура индекса) так же, как от текста запроса. Вот версия того же запроса, которая выражает тот же запрос, но менее дословно и, возможно, более эффективна:

SELECT UserName 
FROM BillingTransactions
GROUP BY UserName
HAVING 0 = SUM(
  CASE RecordType 
  WHEN 1 THEN AMOUNT 
  WHEN 0 THEN -AMOUNT 
  ELSE 0
  END);
3 голосов
/ 23 октября 2009

Попробуйте что-то вроде этого:

select a.username
from (select username, sum(amount) totalAmount
     from BillingTransactions
     where RecordType = 0
     group by username
     ) a
join (select username, sum(amount) totalAmount
     from BillingTransactions
     where RecordType = 1
     group by username
     ) b on b.username = a.username and b.totalAmount = a.totalAmount
...