sql 某字段关联今年1-12月月份值查询

场景模拟:

数据库账务明细表中只存有公司1月和7月的账务明细,比如前端人员有以下需求:给定公司ID返回公司今年1-12月账务汇总,如当月没有数据用0代替,并按月份大小排序。

选定一张行数量大于12的表:

        SELECT
            CASE WHEN length(mon) = 1 THEN concat(LEFT (CURRENT_DATE, 5),'0',mon)
        ELSE
            concat(LEFT(CURRENT_DATE, 5), mon)
        END months
        FROM( SELECT @m :=@m + 1 mon FROM share_sys_area,(SELECT @m := 0) a ) aa LIMIT 12

可以得到一下结果:

这里写图片描述

使用这种方法进行左连接查询,就可以拿到想要结果:

<select id="getTypeSumByMonth" resultType="map">

    select
        tt.months as mon,
        sum(IFNULL(b.YJ_YY_YJ_COUNT,0)) AS yyyCount,
        sum(IFNULL(b.YJ_YY_YJ_DEBT,0)) / 10000 AS yyyDebt,
        sum(IFNULL(b.YJ_YY_WJ_COUNT,0)) AS yynCount,
        sum(IFNULL(b.YJ_YY_WJ_DEBT,0)) / 10000 AS yynDebt,
        sum(IFNULL(b.YJ_WY_COUNT,0)) AS ynCount,
        sum(IFNULL(b.YJ_WY_DEBT,0)) / 10000 AS ynDebt,
        sum(IFNULL(b.STOP_SLOW_COUNT,0)) AS ssCount,
        sum(IFNULL(b.STOP_SLOW_DEBT,0)) / 10000 AS ssDebt
        from
        (SELECT
            CASE WHEN length(mon) = 1 THEN concat(LEFT (CURRENT_DATE, 5),'0',mon)
        ELSE
            concat(LEFT(CURRENT_DATE, 5), mon)
        END months
        FROM( SELECT @m :=@m + 1 mon FROM share_sys_area,(SELECT @m := 0) a ) aa LIMIT 12) tt

        LEFT JOIN share_acc_project_pro b on tt.months = DATE_FORMAT(b.REPORT_TIME,'%Y-%m')

        <if test="_parameter != null and _parameter !=''">
            AND b.ENT_ID = #{_parameter}
        </if>


        GROUP BY tt.months

</select>

这里写图片描述

其他思路

RIGHT JOIN (SELECT '01' as time2 from  DUAL UNION ALL  
SELECT '02' as time2 from  DUAL UNION ALL 
SELECT '03' as time2 from  DUAL UNION ALL 
SELECT '04' as time2 from  DUAL UNION ALL 
SELECT '05' as time2 from  DUAL UNION ALL 
SELECT '06' as time2 from  DUAL UNION ALL 
SELECT '07' as time2 from  DUAL UNION ALL 
SELECT '08' as time2 from  DUAL UNION ALL 
SELECT '09' as time2 from  DUAL UNION ALL 
SELECT '10' as time2 from  DUAL UNION ALL 
SELECT '11' as time2 from  DUAL UNION ALL 
SELECT '12' as time2 from  DUAL )
  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值