Всего два столбца не работают

#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. пожалуйста, посмотрите комментарий выше, я думаю, что нашел проблему.