Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/67.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/5/sql/75.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql 如何计算两个表中科目的金额之和取决于第一个字符部分_Mysql_Sql - Fatal编程技术网

Mysql 如何计算两个表中科目的金额之和取决于第一个字符部分

Mysql 如何计算两个表中科目的金额之和取决于第一个字符部分,mysql,sql,Mysql,Sql,我有两张桌子,两张桌子的数量 在tblaccounts中,我有AccID、AccCode、AccTypeMain或Sub字段 在tblamounts中,我有AccID,TheAmount字段 我需要计算每个账户的总金额,但角色如下所示: +---------+--------+---------+ | AccCode | Amount | AccType | +---------+--------+---------+ | 1 | 2400 | Main | +------

我有两张桌子,两张桌子的数量

在tblaccounts中,我有AccID、AccCode、AccTypeMain或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     |
+---------+--------+---------+
Main12的金额=Sub121500+Sub122300=800

Main11的金额=Sub111100+Sub1121000+Sub113500=1600

Main1=Main111600+Main12800=2400的金额

我试图根据第一个数字对每个帐户进行求和,因此如果我想获得AccCode1的总和,我必须找到以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

如果我理解正确,您希望:

select a.*,
       (select sum(am.amounts)
        from amounts am
        where am.accId like concat(a.accId, '%')
       )
from accounts a;
也就是说,将以给定帐户的相同字符开头的所有帐户的值相加。

简易解决方案

编辑:


您所处的轨道是正确的,但您需要汇总到,但不包括帐户本身,只包括它下面的所有帐户


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”没有自己的金额,并且将仅是以类似代码开头的“子”帐户类型的总和。

Main1=Main11800+main12600应该是Main1=Main111600+Main12800?这里的层次结构是什么?第一个字符是祖父母,第二个字符是父母,第三个字符是孩子?你能有3个以上的等级吗?@P.Salmon父亲是12,所以121和122是孩子,父亲是1,所以11和12是孩子,所以如果我需要12的数量,我应该找到以12开始的账户并计算它们。我认为你需要重新考虑你的schema@Strawberry如何获取以12开头的帐户作为示例,我以前玩过left fun但有件事我不知道是什么父亲12岁所以121和122是孩子,父亲是1,所以11和12是孩子,所以如果我需要12的数量,那么我应该找到以12开始的帐户,并在获取每个帐户循环的帐户记录时计算我需要的帐户记录,其他帐户以我们想要的帐户开始,这在我看来不正确。您可以将CHARLENGTH与上面的内容结合使用来破解一个正确的答案,但这将是非常困难的ugly@Hamada . . 121人喜欢12%的匹配,所以孩子们也包括在内。这似乎是你想要的。如果你想显示为什么你认为它不起作用,你可以设置一个dbfiddle。@GordonLinoff请查看我在主要帖子中所做的更新,我想我只需要更改partSELECT accode的位置,选择SUMTheAmount xResult FROM TBLAMCOUNTS INTERNAL JOIN tblaccounts ON tblaccounts.AccID=TBLAMONTS.AccID,其中AccCode(如xacc.AccCode%)FROM tblaccounts xacc使用xacc.AccCode时会出现错误
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

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;