【问题标题】:Use multiple SQL query results in one SQL query在一个 SQL 查询中使用多个 SQL 查询结果
【发布时间】:2017-04-01 15:22:56
【问题描述】:

我有一个包含两个 MySQL 表的项目;

  • 分类帐时间表
  • 总帐

第一个表 LedgerSchedule 包含在 GeneralLedger 中使用的可能类型。 GeneralLedger 中的每条记录都可以是 CREDIT 或 DEBIT 交易(来自 LedgerSchedule 类型)。

现在,如果我想使用 GeneralLedger 交易创建交易调查,我会在我的项目中运行三个查询;

  • 选择可能的 LedgerSchedule
  • 为每个 LedgerSchedule 选择 CREDIT GeneralLedgers
  • 为每个 LedgerSchedule 选择 DEBIT GeneralLedgers

在这三个查询之后,我将 (DEBIT-CREDIT) 金额保存回每个 LedgerSchedule。 这可行,但速度很慢(尤其是当有许多 LedgerSchedule 时)。 为了加快速度,我想用一个 MySQL 查询来完成。

总结一下,我想在一个查询中选择 LedgerSchedule 及其 CREDIT/DEBIT GeneralLedgers 金额。

第一次尝试(在本例中,我仅从 LedgerSchedule 中选择 ID);

但这只会选择具有借记和贷记交易的总帐。将其更改为

WHERE LS.ID = DEBIT.ID
OR LS.ID = CREDIT.ID

也不行。在此旁边,我还想选择没有任何 GeneralLedgers DEBIT/CREDIT 交易的 LedgerSchedule。

| LedgerSchedule | Debit   | Credit  |
|       1        | €30.00  |         |
|       2        |         | €23.45  |
|       3        |         |         |
|       4        | €15.15  | €10.00  |
|       5        |         |         |

我怎样才能做到这一点?甚至可能在一个查询中没有多个 Select ...

【问题讨论】:

  • 天啊,所有的大写都让你的 SQL 读起来很痛苦,SQL 中的变量(例如列名)通常是小写的,并且只有控制字,例如“SELECT”大写,它使它更具可读性....
  • 同样的原因也是为什么路标不是大写的,是HARDER (SLOWER) TO UNDERSTAND UPPER CASE WRITTEN TEXT BLOCKS
  • 编辑您的问题并提供示例数据和所需的结果。

标签: mysql sql


【解决方案1】:

如果我理解正确,您只需要条件聚合:

select gl.ledger_schedule_id,
       sum(case when gl.debit_credit = 1 then gl.amount else - gl.amount
           end) as net
from GeneralLedger gl
group by gl.ledger_schedule_id;

如果 debit_credit 可以取 0 或 1 以外的值,您将需要一个 where 子句来防止过度计数。

如果您想要单独的金额:

select gl.ledger_schedule_id,
       sum(case when gl.debit_credit = 1 then gl.amount end) as credit,
       sum(case when gl.debit_credit = 0 then gl.amount end) as debit
from GeneralLedger gl
group by gl.ledger_schedule_id;

【讨论】:

  • 这是一个不错的方法 Gordon,但我需要在计算每个 LedgerSchedule 的总数之前显示借方和贷方金额。查询结果需要是每个 LedgerSchedule 的所有 LedgerSchedule 以及借方和/或贷方金额(如果有)。
  • 确实,使用条件聚合即可:)
猜你喜欢
  • 2016-05-08
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多