编写SQL生成分公司事业部损益表合并CASE语句报错如何解决
现有SQL存在的问题
- 语法错误:SELECT子句字段间缺少逗号分隔,
Name字段后、SUM(Credit) AS Credit后均未加逗号,直接触发语法报错 - 聚合逻辑错误:CASE判断直接调用原始行的
Debet/Credit字段,未使用分组后的总借贷金额,同时重复定义Debet/Credit别名,字段命名冲突 - 分组规则不完整:SELECT返回了
Name字段,但GROUP BY仅声明LEDGER_ACCOUNT,若MySQL开启ONLY_FULL_GROUP_BY模式会直接报错,需将与账户一一对应的Name加入分组条件 - 数据类型不兼容:CASE分支同时返回数值和空字符串,两类数据类型不一致会触发隐式转换报错,统一返回数值类型的NULL即可,查询展示时空值会自动显示为空白
修正后可正常运行的SQL
SELECT LEDGER_ACCOUNT, Name, CASE WHEN SUM(Debit) > SUM(Credit) THEN FORMAT(SUM(Debit) - SUM(Credit), 2, 'de_DE') ELSE NULL END AS Debit, CASE WHEN SUM(Credit) > SUM(Debit) THEN FORMAT(SUM(Credit) - SUM(Debit), 2, 'de_DE') ELSE NULL END AS Credit FROM boekingen WHERE Branch = 'BXL' AND Division = 'WPL' GROUP BY LEDGER_ACCOUNT, Name
逻辑说明
- 先通过
SUM(Debit)、SUM(Credit)计算每个账户分组后的总借方、总贷方金额,再做差值判断 FORMAT函数使用de_DE区域参数,可生成你预期的「千分位用点分隔、小数位用逗号分隔」的金额格式,不需要该格式可直接去掉FORMAT函数返回原始数值- 最终查询结果完全匹配你给出的预期输出格式
内容的提问来源于stack exchange,提问作者DebianFox
相关产品推荐
相关产品推荐

