问题描述
我现在有两张表,一张target目标表,一张费用表,目标表一个用户每个月就一条记录,比如设定的各个要完成的目标,费用表可能一个月有好几条记录,记录已完成的数据,表之间的关联用用户的ID,现在遇到问题,想在一个列表中展示目标数据和已完成数据,目标表有目标月份日期字段,费用表有生效日期字段目标月份 目标标保 已完成标保 目标佣金 已完成佣金 目标件数 已完成件数2012-11 1000 500 200000 2000 500 50我现在sql语句如下 select SALES_CODE,target.TARGET_MONTH as targetMonth,target.STD_PREM as stdPrem,target.BROKERAGE as brokerage,target.CASES as cases,d.toStdPrem as totStdPrem,d.toBrokerage as totBrokerage,d.toCases as totCasesfrom AB_TARGET target inner join (select sum(com.STANDARD_PAYMENT) as toStdPrem, sum(com.FINAL_PAY_AMOUNT) as toBrokerage, count(com.id) as toCases,com.SALE_ID,SOURCE from COMMISSION_INFO com <where> <if test="@Ognl@isNotEmpty(targetMonthBegin)"> <![CDATA[ com.EFFECTIVE_DATE >= #{targetMonthBegin}]]> </if> <if test="@Ognl@isNotEmpty(targetMonthEnd)"><![CDATA[ and com.EFFECTIVE_DATE <= #{targetMonthEnd}]]> </if> </where> group by com.sale_id, com.source)d on target.SALES_CODE = d.SALE_ID <if test="@Ognl@isNotEmpty(salesCode)">AND target.SALES_CODE = #{salesCode} and d.source='1801'</if> <where> <if test="@Ognl@isNotEmpty(targetMonthBegin)"><![CDATA[ target.TARGET_MONTH >= #{targetMonthBegin}]]> </if> <if test="@Ognl@isNotEmpty(targetMonthEnd)"><![CDATA[ and target.TARGET_MONTH <= #{targetMonthEnd}]]> </if> <if test="@Ognl@isNotEmpty(salesName)">AND target.SALES_CODE =#{salesName} </if><if test="@Ognl@isNotEmpty(sortColumns)">ORDER BY ${sortColumns}</if></where>查询出的数据不正确,比如目标表11月份和12月份有两条数据,而费用表仅11月份有数据,结果按照上面语句查询出来11月份和12月份的费用已完成的情况是一样的,正确的费用表12月份查出来相应已完成的记录应该为空,求解答
解决方案
怀疑这个联表条件(on target.SALES_CODE = d.SALE_ID)的正确性? 有日期条件的时候查询结果才是对的,很有可能是日期条件+target.SALES_CODE = d.SALE_ID这个才能真正定位目标表对应的费用明细;
解决方案二:
比如目标表11月份和12月份有两条数据,而费用表仅11月份有数据,结果按照上面语句查询出来11月份和12月份的费用已完成的情况是一样的,正确的费用表12月份查出来相应已完成的记录应该为空,求解答很明显你的需求是外连 不是 内连即目标和费用直接是外链关系 如用left join
解决方案三:
TARGET_MONTH >targetMonthBeginTARGET_MONTH <targetMonthEnd你的费用表种的生效日期字段 是不是11月份的 生效日期 肯定是>=11.1 <==11.30如果是这样就应该没得问题 或者你打印下执行的sql语句放到查询分析器 看看