SQL多LEFT JOIN查询按Cliente字段GROUP BY分组求和实现客户报表
问题原因
- 你当前查询中计算金额的
Col2字段提前用FORMAT()函数转成了货币格式字符串,字符串类型无法直接做数值求和 - 没有对
Cliente字段添加分组聚合逻辑,因此返回的是所有匹配条件的明细行,而非客户维度的汇总行
修正方案
核心逻辑是先计算单条明细的数值型金额,按Cliente分组求和完成汇总后,最后再对汇总值做货币格式化,修正后的SQL如下:
SELECT TAB_Aditivos.Cliente As Col1, -- 先对明细金额求和,最后再做货币格式转换 FORMAT( SUM( TAB_Aditivos.Diferencial + TAB_Aditivos.[Ad Valorem] + IIF(ConsiderarJ = 0, TAB_Aditivos.[IOF Adicional], 0) + IIF(ConsiderarJ = 0, TAB_Aditivos.IOF, 0) + TAB_Aditivos.[Outros Créditos] - TAB_Aditivos.[Outros Débitos] + ISNULL(Juros,0) ), 'C' ) As Col2 FROM TAB_Aditivos LEFT JOIN ( SELECT ID_Aditivo, SUM(Juros) AS Juros FROM TAB_Aditivos_Devolvidos GROUP BY ID_Aditivo ) TAB_Aditivos_Devolvidos ON TAB_Aditivos.ID_Aditivo = TAB_Aditivos_Devolvidos.ID_Aditivo LEFT JOIN ( SELECT ID, Considerar AS ConsiderarJ FROM TAB_Lojas ) TAB_Lojas ON TAB_Aditivos.Loja = TAB_Lojas.ID WHERE TAB_Aditivos.[Data Aditivo] >= @DataInicial -- 按客户字段分组 GROUP BY TAB_Aditivos.Cliente ORDER BY TAB_Aditivos.Cliente ASC
注意点
- 不要在聚合前对数值做格式化转字符串操作,否则会导致求和逻辑失效,所有格式化操作都要放在聚合计算完成之后
- 分组时SELECT子句里的非聚合字段,必须全部写在GROUP BY子句中,当前场景只需要按
Cliente分组即可满足需求
内容的提问来源于stack exchange,提问作者Heitor Badotti
相关产品推荐
相关产品推荐

