#sql #sqlite #system.data.sqlite
#sql #sqlite #system.data.sqlite
Вопрос:
Я хочу получить общее количество из суммы, где благотворительность равна 0, минус сумма суммы, где благотворительность равна 1.
SELECT SUM(Amount) - (SELECT SUM(Amount)
FROM Transactions
WHERE (Charity = 1))
FROM Transactions
WHERE (Charity = 0)
Этот запрос выполняется, но не дает правильных результатов.
Комментарии:
1. Образец данных? Ожидаемые результаты? Немного сложно понять, как это исправить, когда мы не знаем, что не так.
2. Я думаю, что у меня проблема .. некоторые значения отрицательные, некоторые положительные, вот почему результаты не такие, как ожидалось. как я могу сделать так, чтобы все числа считались положительными?
3. мы можем заставить его обрабатывать все значения положительно (вставив
ABS()
вызов вокругAmount
столбца), но это вызывает серьезные вопросы о том, имеет ли результирующее вычисление (финансовый) смысл.4. Мне кажется, что делать отрицательное число положительным для целей СУММЫ было бы «неправильным поступком» — вы уверены, что хотите это сделать?
5. Спасибо, это помогает… Большое спасибо всем вам.
Ответ №1:
Обработка всех значений как положительных:
SELECT SUM(ABS(Amount)) - (SELECT SUM(ABS(Amount))
FROM Transactions
WHERE (Charity = 1))
FROM Transactions
WHERE (Charity = 0)
Но это серьезно сомнительно, что отрицательные транзакции должны обрабатываться так же, как положительные. Если в этой таблице есть законно отрицательные транзакции, то их, вероятно, следует рассматривать как отрицательные (как в вашем исходном запросе) или исключить:
SELECT SUM(Amount) - (SELECT SUM(Amount)
FROM Transactions
WHERE (Charity = 1) AND Amount > 0)
FROM Transactions
WHERE (Charity = 0) AND Amount > 0
Не уверен, какие средства доступны в sqlite. В стандартном SQL я бы, вероятно, переписал это как:
SELECT
COALESCE(SUM(CASE WHEN Charity=0 THEN Amount END),0) -
COALESCE(SUM(CASE WHEN Charity=1 THEN Amount END),0)
FROM Transactions
WHERE
Charity in (0,1) AND
Amount > 0
(Или аналогичное преобразование для ABS
версии)
Комментарии:
1. Одно из
SUM(CASE...)
выражений в последнем запросе вернуло бы значение NULL (и, таким образом, весь результат был бы тогда равен NULL) в случае, если были строки только сCharity=0
или только сCharity=1
(не обязательно случай OP, конечно).
Ответ №2:
Попробуйте, если это поможет.
select a.sum1 - b.sum2
from
(SELECT SUM(Amount) as sum1 FROM Transactions WHERE (Charity = 0)) A,
(SELECT SUM(Amount) as sum2 FROM Transactions WHERE (Charity = 1)) B
Ответ №3:
Попробуйте следующее (я надеюсь, это допустимо в SQLite):
SELECT (SELECT SUM(Amount) FROM Transactions WHERE (Charity = 0)) -
(SELECT SUM(Amount) FROM Transactions WHERE (Charity = 1))
Комментарии:
1. Значит, это не дает вам (общая благотворительность 0) — (общая благотворительность 1)?
2. пожалуйста, посмотрите комментарий выше, я думаю, что нашел проблему.