#mysql
#mysql
Вопрос:
Я пытаюсь ПРОСУММИРОВАТЬ свой столбец (СУММУ), где все значения положительные ( ), как моя кредиторская задолженность, и снова ПРОСУММИРОВАТЬ тот же столбец (СУММУ), где все значения отрицательные (-сумма), как ПРОИЗВЕДЕННЫЕ ПЛАТЕЖИ. ЗАТЕМ я хочу сравнить, была ли переплата PAYMENTSMADE < КРЕДИТОРСКАЯ ЗАДОЛЖЕННОСТЬ студента имеет баланс ИЛИ PAYMENTSMADE > КРЕДИТОРСКАЯ ЗАДОЛЖЕННОСТЬ студента.
`SELECT
studentledger.ledgerno,
SUM(studentledger.amount(ALL POSITIVE AMOUNT)) AS payables
Sum(studentledger.amount(ALL NEGATIVE AMOUNT)) AS paymentsmade
FROM
studentledger
WHERE
studentledger.period = '1'
GROUP BY
studentledger.ledgerno
СТРУКТУРА БАЗЫ ДАННЫХ
CREATE TABLE IF NOT EXISTS `studentledger` (
`ledgerno` int(11) NOT NULL
AUTO_INCREMENT,
`sourcedoc` int(11) NOT NULL,
`student` int(11) NOT NULL,
`type` varchar(11)
NOT NULL,
`period` int(11) NOT NULL,
`amount` decimal(11,2) NOT NULL DEFAULT '0.00',
`date`
date NOT NULL,
PRIMARY KEY (ledgerno)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 `
ПРИМЕРЫ ЗАПИСЕЙ
INSERT INTO `studentledger`
(`ledgerno`, `sourcedoc`, `student`, `type`, `period`, `amount`, `date`)
VALUES
(3644, 144444, 164, 'A', 1, '18080.67', '2019-02-08'),
(1462, 921020, 164, 'R', 1, '-5000.00', '2019-02-08'),
(1465, 921265, 164, 'R', 1, '-5000.00', '2019-02-08'),
(1467, 921592, 164, 'R', 1, '-3000.00', '2019-02-08'),
(1212, 121125, 164, 'SA', 1, '42.00', '2019-02-08'),
(6333, 916177, 164, 'R', 1, '-5122.67', '2019-02-12'),
(1111, 920001, 152, 'A', 1, '18696.95', '2019-02-13'),
(1023, 929258, 152, 'R', 1, '-2000.00', '2019-02-13'),
(1133, 929267, 152, 'R', 1, '-3500.00', '2019-02-13'),
(1211, 917588, 152, 'R', 1, '-500.00', '2019-02-13'),
(1365, 932504, 152, 'SA', 1, '-96.00', '2019-02-13'),
(1478, 920007, 152, 'R', 1, '-4000.00', '2019-02-13'),
(1599, 922291, 152, 'R', 1, '-5000.00', '2019-02-13'),
(1600, 932618, 152, 'R', 1, '-600.00', '2019-02-13'),
(1743, 932752, 152, 'R', 1, '-2692.95', '2019-02-13'),
(1630, 932618, 152, 'R', 1, '-400.00', '2019-02-13'),
(1610, 932618, 152, 'R', 1, '-100.00', '2019-02-13');
Я пытаюсь получить конечный результат, если я хочу отобразить запись с идентификатором БАЛАНСА, скажем
`WHERE PAYABLES-PAYMENTSMADE != 0 //with remaining balance
OR
WHERE PAYABLES-PAYMENTSMADE < 0 //Overpayment`
Ответ №1:
Вы можете просто SUM
указать все суммы для данного студента, чтобы получить баланс. Поскольку вы используете агрегатную функцию, вы должны проверить значение в HAVING
предложении:
SELECT ledgerno,
SUM(CASE WHEN amount > 0 THEN amount ELSE 0 END) AS payables,
-SUM(CASE WHEN amount < 0 THEN amount ELSE 0 END) AS paymentsmade,
SUM(amount) AS balance
FROM studentledger
WHERE period = 1
GROUP BY ledgerno
HAVING balance != 0
Вывод (для ваших выборочных данных):
ledgerno payables paymentsmade balance
1023 0 2000 -2000
1111 18696.95 0 18696.95
1133 0 3500 -3500
1211 0 500 -500
1212 42 0 42
1365 0 96 -96
1462 0 5000 -5000
1465 0 5000 -5000
1467 0 3000 -3000
1478 0 4000 -4000
1599 0 5000 -5000
1600 0 600 -600
1610 0 100 -100
1630 0 400 -400
1743 0 2692.95 -2692.95
3644 18080.67 0 18080.67
6333 0 5122.67 -5122.67
Ответ №2:
используйте наличие
SELECT
studentledger.ledgerno,
SUM(case when studentledger.amount>0 then studentledger.amount end) AS payables
Sum(case when studentledger.amount<0 then studentledger.amount end) AS paymentsmade
FROM
studentledger
WHERE
studentledger.period = '1'
GROUP BY
studentledger.ledgerno
having paymentsmade != 0 or paymentsmade < 0
Комментарии:
1. как я могу вычесть платежи из кредиторской задолженности, а затем проверить, меньше или больше 0?
2. @Raymond, где вы хотите это проверить — в предложении where или в списке выбора
3. возможно ли это как один запрос? чтобы уменьшить время выполнения, поскольку я работаю с тысячами записей. это похоже на то, что каждая запись должна вычитать кредиторскую задолженность в paymentsmade, поэтому, если я хочу выбрать только записи с балансом, он должен быть > 0, а если переплачено < 0