#mysql #sql
#mysql #sql
Вопрос:
У меня есть две таблицы tblaccounts tblamounts
в tblaccounts у меня есть поля AccID, AccCode, AccType (Main или Sub)
в tblamounts у меня есть поля AccID, TheAmount
Мне нужно рассчитать общие суммы для каждой учетной записи, но роль такова, как вы можете видеть в следующих данных:
--------- -------- ---------
| AccCode | Amount | AccType |
--------- -------- ---------
| 1 | 2400 | Main |
--------- -------- ---------
| 11 | 1600 | Main |
--------- -------- ---------
| 111 | 100 | Sub |
--------- -------- ---------
| 112 | 1000 | Sub |
--------- -------- ---------
| 113 | 500 | Sub |
--------- -------- ---------
| 12 | 800 | Main |
--------- -------- ---------
| 121 | 500 | Sub |
--------- -------- ---------
| 122 | 300 | Sub |
--------- -------- ---------
суммы для (Main) 12 = Sub121 (500) Sub122 (300) = 800
суммы для (Main) 11 = Sub111 (100) Sub112 (1000) Sub113 (500) = 1600
суммы для (Main) 1 = Main11 (1600) Main12 (800) = 2400
Я пытался суммировать каждую учетную запись в зависимости от первого числа, поэтому, если я хочу получить сумму AccCode(1), я должен найти учетные записи, начинающиеся с 1, и суммировать все их суммы, но как проверить другие учетные записи, которые содержат более 1 символа, например 12, я хочу указать сумму121 122
Обновления: я использовал следующий код:
SELECT AccCode,
(
SELECT SUM(TheAmount) xResult FROM tblamounts
INNER JOIN tblaccounts ON tblaccounts.AccID = tblamounts.AccID
WHERE AccCode LIKE xacc.AccCode%
) FROM tblaccounts xacc
Комментарии:
1. (Main)1 = Main11 (800) Main12 (1600) должно быть (Main) 1 = Main11 (1600) Main12 (800)?
2. Какова здесь иерархия — является ли первый символ прародителем, второй символ родительским, а третий символ дочерним? может ли у вас быть более 3 уровней?
3. @P.Salmon Отец равен 12, поэтому 121 и 122 — дочерние элементы, отец равен 1, поэтому 11 и 12 — дочерние элементы, поэтому, если мне нужны суммы 12, я должен найти учетные записи, начинающиеся с 12, и вычислить их.
4. Я думаю, вам нужно переосмыслить свою схему
5. @Strawberry как получить учетные записи, начинающиеся с 12 в качестве примера я использовал left() fun, но есть упущенная вещь, я не знаю, что это
Ответ №1:
Если я правильно понимаю, вы хотите:
select a.*,
(select sum(am.amounts)
from amounts am
where am.accId like concat(a.accId, '%')
)
from accounts a;
То есть суммируйте значения со всех учетных записей, которые начинаются с одних и тех же символов данной учетной записи.
Комментарии:
1. Отец равен 12, поэтому 121 и 122 являются дочерними элементами, отец равен 1, поэтому 11 и 12 являются дочерними элементами, поэтому, если мне нужны суммы 12, я должен найти учетные записи, начинающиеся с 12, и вычислить их
2. Мне нужно во время получения записей учетной записи для каждого цикла учетной записи на других учетных записях, которые начинаются с учетной записи, на которую мы хотим получить ее сумму
3. Мне это кажется неправильным. Вы могли бы взломать правильный ответ, используя CHARLENGTH в сочетании с приведенным выше, но это будет некрасиво
4. @Hamada . . И
121 like 12%
спички, так что дети включены. Казалось бы, это делает то, что вы хотите. Вы можете настроить db<>скрипку, если хотите показать, почему, по вашему мнению, это не сработает.5. @GordonLinoff пожалуйста, посмотрите Обновления, которые я сделал в основном сообщении, я думаю, мне просто нужно изменить, где часть
Ответ №2:
Вы на правильном пути, но вам нужно суммировать до, но не включая саму учетную запись (только все учетные записи под ней)
SELECT a.AccCode AS AccountCode,
(SELECT SUM(tblamounts.TheAmount) FROM tblamounts, tblaccounts g
WHERE tblamounts.AccID = g.AccID AND (g.AccCode LIKE CONCAT(a.AccCode,'%')
AND NOT (g.AccCode = a.AccCode AND LOWER(a.AccType) = 'main'))) AS AccountSum ,
a.AccType AS AccountType
FROM tblaccounts a;
Таким образом, в вашем результате AccountCode 12 будет суммой 121 и 122.
Предполагается, что AccountType ‘Main’ не будет иметь своей собственной суммы и будет представлять собой только сумму типов учетных записей ‘Sub’, начинающихся с аналогичного кода.
Ответ №3:
Простое решение https://www.w3schools.com/sql/sql_like.asp
select sum(Amount) from tab where AccCode LIKE "12_"
select sum(Amount) from tab where AccCode LIKE "11_"
select sum(Amount) from tab where AccCode LIKE "1_"
Редактировать:
SELECT m1.AccCode, sum(m2.Amount) from tab m1
inner join tab m2 on m2.AccCode LIKE m1.AccCode || "_"
where m1.accType = "Main"
group by m1.AccCode
Комментарии:
1. ВЫБЕРИТЕ AccCode, (ВЫБЕРИТЕ SUM(TheAmount) xResult ИЗ tblamounts ВНУТРЕННЕЕ ОБЪЕДИНЕНИЕ tblaccounts НА tblaccounts. AccID = tblamounts. AccID, ГДЕ AccCode ПОХОЖ НА xacc. AccCode% ) ИЗ tblaccounts xacc выдает ошибку, когда я использую xacc. Код доступа