как рассчитать сумму сумм для счетов в двух таблицах зависит от первой части символов

#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. Код доступа