Mysql条件聚合使用按查询分组和按月份和年份分组

Mysql条件聚合使用按查询分组和按月份和年份分组,mysql,sql,database,group-by,mariadb,Mysql,Sql,Database,Group By,Mariadb,我有一个表结构,在这里我以下面的格式保存数据 分类账金额需要分为两列,并通过总和公式进行分组 那些收款id不为空的行,其分类账金额需要显示为作为贷方的合计(分类账金额)整行付款id不为空的行,其分类账金额需要显示为作为借方的合计(分类账金额) 需要使用“月-年”对这些值进行分组,该“月-年”是从使用“日期周期”的join的收货和付款主表的日期获取的 除了一个小故障外,我在开发整个查询方面非常成功 当我在“月-年”上使用“group_by”查询时,它根据特定条件中较高的行数(我想分开)汇总借方/

我有一个表结构,在这里我以下面的格式保存数据

分类账金额需要分为两列,并通过总和公式进行分组

那些收款id不为空的行,其分类账金额需要显示为作为贷方的合计(分类账金额)整行付款id不为空的行,其分类账金额需要显示为作为借方的合计(分类账金额)

需要使用“月-年”对这些值进行分组,该“月-年”是从使用“日期周期”的join的收货和付款主表的日期获取的

除了一个小故障外,我在开发整个查询方面非常成功

当我在“月-年”上使用“group_by”查询时,它根据特定条件中较高的行数(我想分开)汇总借方/贷方中特定月份的所有记录

检查此图像

目前我还没有在这方面按月申请group_,它完美地展示了个人记录

请看下面我每月申请group_时发生的情况

它汇总所有分类账金额值,并在债务侧显示为53819.00,而不是在贷方显示为19500.00,在借方显示为34319.00

下面是我对上述结果的查询

查询第二个图像

SELECT sjm.company_id as sjm_company_id,
    (CASE when sjm.payment_id IS NOT NULL then sum(sjm.ledger_amount) END) AS "CREDIT",
    (CASE when sjm.receipt_id IS NOT NULL then sum(sjm.ledger_amount) END) AS "DEBIT",

    (CASE when sjm.payment_id IS NOT NULL then date_format(sim.payment_date,'%Y-%m')
          when sjm.receipt_id IS NOT NULL then date_format(rim.receipt_date,'%Y-%m') END) AS s_year_month

    FROM ledger_mapper_master sjm
    LEFT JOIN payment_master sim ON sjm.payment_id = sim.payment_id
    LEFT JOIN receipt_master rim ON sjm.receipt_id = rim.receipt_id

    WHERE sjm.sundry_dr_cr_ledger_id IS NOT NULL AND sjm.ledger_id='5991'
    group by ledger_mapper_id
    HAVING s_year_month = '2020-05' AND sjm_company_id = '1' ORDER BY s_year_month;
查询第三个图像-这两个都是相同的,group_by子句中有一个小的更改,即group with s_year_MOUNT

请告诉我需要做什么更改才能将借方部分和贷方部分的金额保留在各自的列中,而不是两者合并


i、 e.在这一行中,这里的值应该是借方金额:34319和贷方金额:19500。

我想您需要条件聚合:

SELECT sjm.company_id as sjm_company_id,
       (CASE WHEN sjm.payment_id IS NOT NULL then date_format(sim.payment_date, '%Y-%m')
             WHEN sjm.receipt_id IS NOT NULL then date_format(rim.receipt_date, '%Y-%m')
        END) AS s_year_month
       SUM(CASE when sjm.payment_id IS NOT NULL then sjm.ledger_amount) END AS CREDIT,
       SUM(CASE when sjm.receipt_id IS NOT NULL then sjm.ledger_amount) END AS DEBIT    
FROM ledger_mapper_master sjm LEFT JOIN
     payment_master sim
     ON sjm.payment_id = sim.payment_id LEFT JOIN
     receipt_master rim
     ON sjm.receipt_id = rim.receipt_id
WHERE sjm.sundry_dr_cr_ledger_id IS NOT NULL AND
      sjm.ledger_id = 5991 AND
      sjm_company_id = 1
GROUP BY sjm_company_id, s_year_month
HAVING s_year_month = '2020-05'
ORDER BY s_year_month;
注:

  • 条件聚合将
    大小写作为聚合函数的参数
  • groupby
    键应与
    SELECT
    中的未聚合列相匹配
  • “id”列看起来像数字,所以我删除了用于比较的单引号。如果它们确实是字符串,则使用单引号
此外,
s_年\月
计算可简化为:

DATE_FORMAT(COALESCE(sim.payment_date, rim.receipt_date) '%Y-%m') AS s_year_month

但我让您的版本在上面。

如果sjm.ledger\u金额为0,则sjm.ledger\u金额为0,否则以借方结束。
@Luuk ledger金额永远不会为0或空,请检查实际表格。根据收据id和付款id中的非空值,我将分类账金额中的两列分隔为借方或贷方!这是可行的,SUM()必须如您所建议的那样位于外侧,但在将其标记为完成之前,我将在周一使用更大的数据集进行验证并确认。
DATE_FORMAT(COALESCE(sim.payment_date, rim.receipt_date) '%Y-%m') AS s_year_month