mysql - 根据表 Y 中的值进行小计的条件总和,与表 X 中的值一起显示。然后根据表 X 中的条件生成总计

标签 mysql sql

我有表 X:

| key | name   | drcr | drcr_other | coa_type | coa_header |
|-----|--------|------|------------|----------|------------|
| 1   | assets | dr   | cr         | head     |            |
| 2   | cash   | dr   | cr         | sub      | assets     |
| 3   | bank   | dr   | cr         | sub      | assets     |
| 4   | equity | cr   | dr         | head     |            |
| 5   | income | cr   | dr         | sub      | equity     |

我有表 Y:

| key | account | drcr | amount |
|-----|---------|------|--------|
| 1   | bank    | dr   | 1000   |
| 2   | income  | cr   | 1000   |
| 3   | cash    | dr   | 100    |
| 4   | bank    | cr   | 100    |

我想生成一个查询,使其显示: 其中 Assets 和权益是其子账户的总计(标题行)。例如,收入是权益的子账户,由于收入为 1000,权益应为 1000。

| account | amount |
|---------|--------|
| bank    | 900    |
| income  | 1000   |
| cash    | 100    |
| assets  | 1000   |
| equity  | 1000   |

到目前为止,我可以将银行和现金相加,因为它们在表 Y 中需要添加金额,我不确定如何添加 Assets 总额(现金和银行的总和)和权益(总和)的收入)。目前我正在使用以下语句总结所有内容...

SELECT name,
SUM( 
    IF(account = name AND Y.drcr = X.drcr, amount, 0) - IF(account = name AND Y.drcr = X.drcr_other, amount, 0)
) 
AS Total FROM `Y`, `X`
GROUP BY name ORDER BY name

我想我可以使用 coa_header 和 coa_type 字段对总数进行求和。我是 MySQL 的新手,我只是在玩,这只是我正在修改的个人夏季项目。感谢任何帮助,谢谢!

这一切都在 MySQL 5.0.11 中

最佳答案

我不明白银行怎么得到900,因为贷方和借方各有1100。如果你减去它们的总和,当然你会得到0。

我能做的就是向您展示如何使减法成为可能。然后您可以向该技术提供您自己的查询。

这个技巧被称为折叠:对于每一行,您创建N。您想要添加/减去的列变成两列(在您的情况下,N=2),然后您只需减去它们即可。

基本思想如下:

select account, side
           , case side when 'dr' then amount else 0 end as debit
           , case side when 'cr' then amount else 0 end as credit
    from (
         select 'dr' as side UNION select 'cr'
    ) as U
    cross join T
    where account = 'bank'
    ;
account     side        debit       credit    
----------  ----------  ----------  ----------
bank        cr          0           1000      
bank        cr          0           100       
bank        dr          1000        0         
bank        dr          100         0         

我们可以将其压缩为一行:

select account
       , sum( case side when 'dr' then amount else 0 end ) as debit
       , sum( case side when 'dr' then amount else 0 end ) as debit
from (
     select 'dr' as side UNION select 'cr'
) as U
cross join T
where account = 'bank'
group by account
;
account     debit       debit     
----------  ----------  ----------
bank        1100        1100      

您面临的挑战是以(我猜)借方为 100 的方式连接表格。然后减法就会很容易。 :-)

HTH。

关于mysql - 根据表 Y 中的值进行小计的条件总和,与表 X 中的值一起显示。然后根据表 X 中的条件生成总计,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38413331/

相关文章:

java - MySQL Connector/J - 将 Java 字符串映射到 MySQL INT

mysql - 如何清除mysql中的查询缓存?

MySQL 时间范围按 DAYNAME 分组

sql - 如何在 FORMSOF Inflectional 全文搜索中获取匹配项的位置?

c# - 可以使用 C# 以编程方式反编译存储过程

mysql - 如何在更新语句中使用 SQL 变量递增

mysql 使用 GROUP CONCAT 和 JOIN 选择多行

mysql - 两列SQL共存

mysql - 学习 MySQL 中的 LEFT JOIN

sql - 从 oracle tmstmp 字段中删除毫秒