<?xml version="1.0" encoding="UTF-8" ?>
|
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN"
|
"http://mybatis.org/dtd/mybatis-3-mapper.dtd">
|
<mapper namespace="reportFeeServiceDaoImpl">
|
<select id="repostInFee" resultType="java.util.Map">
|
SELECT
|
f.fee_type_cd AS 'fee_type_cd',
|
f.detail_year,
|
ROUND(SUM(CASE WHEN f.detail_year BETWEEN ${startYear} AND ${endYear} THEN f.receivable_amount ELSE 0 END), 2) AS '该年应缴总额',
|
ROUND(
|
CASE
|
WHEN SUM(CASE WHEN f.detail_year BETWEEN ${startYear} AND ${endYear} THEN f.receivable_amount ELSE 0 END) = 0 THEN 0
|
ELSE SUM(CASE WHEN f.detail_year BETWEEN ${startYear} AND ${endYear} AND f.detail_id != -1 THEN f.received_amount ELSE 0 END)
|
/ SUM(CASE WHEN f.detail_year BETWEEN ${startYear} AND ${endYear} THEN f.receivable_amount ELSE 0 END) * 100
|
END, 2
|
) AS '当年收缴率',
|
|
ROUND(SUM(CASE
|
WHEN f.detail_year BETWEEN ${startYear} AND ${endYear} AND f.detail_id != -1 THEN d.discount_amount
|
ELSE 0
|
END), 2) AS '折扣金额',
|
|
<foreach collection="yearList" item="year" separator=",">
|
<if test="year != endYear"> <!-- 排除最后一年,最后一年单独处理为“当年实缴” -->
|
ROUND(SUM(CASE
|
WHEN YEAR(d.create_time) = ${year} AND f.detail_id != -1 THEN f.received_amount
|
ELSE 0
|
END), 2) AS '${year}年实缴'
|
</if>
|
</foreach>,
|
|
ROUND(SUM(CASE WHEN f.detail_year = ${endYear} THEN f.receivable_amount ELSE 0 END), 2) AS '当年预算',
|
ROUND(SUM(CASE WHEN YEAR(d.create_time) = ${endYear} AND f.detail_id != -1 THEN d.received_amount ELSE 0 END), 2) AS '${endYear}年实缴',
|
ROUND(SUM(CASE WHEN YEAR(d.create_time) = ${endYear} AND f.detail_id != -1 THEN d.discount_amount ELSE 0 END), 2) AS '当年折扣总额',
|
ROUND(SUM(CASE WHEN YEAR(d.create_time) = ${endYear} AND f.detail_id != -1 THEN d.receivable_amount ELSE 0 END), 2) AS '当年欠款',
|
|
<foreach collection="monthList" item="month" separator=",">
|
ROUND(SUM(CASE
|
WHEN YEAR(d.create_time) = YEAR(#{currentYear}) AND MONTH(d.create_time) = ${month} AND f.detail_id != -1 THEN d.received_amount
|
ELSE 0 END), 2) AS '当年${month}月实缴'
|
</foreach>,
|
|
ROUND(SUM(CASE WHEN f.detail_year BETWEEN ${startYear} AND ${endYear} THEN f.receivable_amount ELSE 0 END) / COUNT(DISTINCT CASE WHEN f.detail_year BETWEEN 2018 AND 2025 THEN CONCAT(f.detail_year, '-', f.detail_month) END), 2) AS '每月费用',
|
COUNT(DISTINCT CASE WHEN f.detail_year BETWEEN ${startYear} AND ${endYear} THEN CONCAT(f.detail_year, '-', f.detail_month) END) AS '应收月份数',
|
|
CASE
|
WHEN f.detail_year IS NULL THEN '类型总计'
|
ELSE CAST(f.detail_year AS CHAR)
|
END AS '费用所属年份'
|
|
FROM
|
pay_fee_detail_month f
|
LEFT JOIN pay_fee_detail d on d.detail_id = f.detail_id
|
WHERE
|
f.community_id = #{communityId}
|
AND f.detail_year BETWEEN ${startYear} AND ${endYear} <!-- 动态年份过滤 -->
|
GROUP BY
|
f.fee_type_cd, f.detail_year
|
WITH ROLLUP;
|
</select>
|
|
<select id="repostInFeeTwo" resultType="java.util.Map">
|
SELECT
|
year AS 年份,
|
month AS 月份,
|
SUM(应缴金额) AS 应缴金额,
|
SUM(实缴金额) AS 实缴金额
|
FROM (
|
-- 子查询分别计算应缴和实缴,同时提取月份
|
SELECT
|
YEAR(in_time) AS year,
|
MONTH(in_time) AS month, -- 提取月份
|
payment_amount AS 应缴金额,
|
0 AS 实缴金额
|
FROM car_inout WHERE community_id = #{communityId}
|
|
UNION ALL
|
|
SELECT
|
YEAR(create_time) AS year,
|
MONTH(create_time) AS month, -- 提取月份
|
0 AS 应缴金额,
|
payment_amount AS 实缴金额
|
FROM car_inout WHERE community_id = #{communityId}
|
) AS temp
|
GROUP BY year, month -- 同时按年份和月份分组
|
ORDER BY year, month; -- 同时按年份和月份排序
|
</select>
|
|
<select id="countRepostPaidInFeeByWhiteOrder" parameterType="Map" resultType="Map">
|
WITH RECURSIVE year_ranges AS (
|
-- 基础查询:与原SQL一致,生成初始数据和递归所需字段
|
SELECT
|
ROW_NUMBER() OVER () AS row1,
|
bc.`name` AS row2,
|
ROW_NUMBER() OVER () AS row3,
|
pfd.create_time AS row4,
|
pw.invoice_receipt_no AS row5,
|
br.property_address AS row6,
|
br.door_room_num AS row7,
|
CONCAT(pfd.start_time, ' 至 ', pfd.end_time) AS row8,
|
YEAR(pfd.start_time) AS row9,
|
YEAR(pfd.end_time) AS row10,
|
pfc.fee_name AS row11,
|
pfd.received_amount AS row12,
|
pfd.cashier_name AS row13,
|
pw.bank_deposit_date AS row14,
|
pw.bank_depositor AS row15,
|
pw.bank_deposit_amount AS row16,
|
pw.split_bank_deposit_amount AS row17,
|
pw.check_amount AS row18,
|
pw.white_list_archive_no AS row19,
|
pw.sheet_count AS row20,
|
pw.financial_receiver AS row21,
|
pw.input_time AS row22,
|
pw.input_person AS row23,
|
pw.input_time AS row24,
|
YEAR(pw.input_time) AS row25,
|
pw.license_plate AS row26,
|
pw.category_22 AS row27,
|
YEAR(pfd.start_time) AS current_year, -- 递归起始年份
|
YEAR(pfd.end_time) AS end_year, -- 递归终止年份
|
pfd.start_time AS original_start,
|
pfd.end_time AS original_end
|
FROM pay_fee_detail pfd
|
LEFT JOIN s_community bc ON bc.community_id = pfd.community_id
|
LEFT JOIN pay_fee pf ON pf.fee_id = pfd.fee_id
|
LEFT JOIN building_room br ON br.room_id = pf.payer_obj_id
|
left join building_unit bu on br.unit_id = bu.unit_id
|
left join f_floor ff on ff.floor_id = bu.floor_id
|
LEFT JOIN pay_fee_config pfc ON pf.config_id = pfc.config_id
|
LEFT JOIN property_white_list_flow pw
|
ON DATE(pfd.create_time) = pw.charge_time
|
AND pfd.start_time = pw.charge_start
|
AND pfd.cashier_name = pw.charger
|
AND pw.door_room_num = CONCAT(ff.floor_num,'-',br.door_room_num)
|
WHERE pfd.state = 1400 and pf.payer_obj_type = '3333'
|
<if test="communityId != null">
|
AND pfd.community_id = #{communityId} -- 保留原社区筛选条件
|
</if>
|
|
UNION ALL
|
|
-- 递归查询:与原SQL一致,递增年份生成中间记录
|
SELECT
|
row1,
|
row2,
|
row3,
|
row4,
|
row5,
|
row6,
|
row7,
|
row8,
|
row9,
|
row10,
|
row11,
|
row12,
|
row13,
|
row14,
|
row15,
|
row16,
|
row17,
|
row18,
|
row19,
|
row20,
|
row21,
|
row22,
|
row23,
|
row24,
|
row25,
|
row26,
|
row27,
|
current_year + 1 AS current_year,
|
end_year,
|
original_start,
|
original_end
|
FROM year_ranges
|
WHERE current_year + 1 <= end_year -- 递归终止条件:年份未超过结束年
|
)
|
|
-- 核心:统计递归结果集的总条数
|
SELECT COUNT(*) AS count
|
FROM year_ranges;
|
</select>
|
|
<select id="repostPaidInFeeByWhiteOrder" resultType="java.util.Map">
|
WITH RECURSIVE year_ranges AS (
|
-- 基础查询:获取所有需要的字段并计算起始年份和结束年份
|
SELECT
|
ROW_NUMBER() OVER () AS row1,
|
bc.`name` AS row2,
|
ROW_NUMBER() OVER () AS row3,
|
pfd.create_time AS row4,
|
pw.invoice_receipt_no AS row5,
|
br.property_address AS row6,
|
br.door_room_num AS row7,
|
CONCAT(pfd.start_time, ' 至 ', pfd.end_time) AS row8,
|
YEAR(pfd.start_time) AS row9, -- 起始年份
|
YEAR(pfd.end_time) AS row10, -- 结束年份
|
pfc.fee_name AS row11,
|
pfd.received_amount AS row12,
|
pfd.cashier_name AS row13,
|
pw.bank_deposit_date AS row14,
|
pw.bank_depositor AS row15,
|
pw.bank_deposit_amount AS row16,
|
pw.split_bank_deposit_amount AS row17,
|
pw.check_amount AS row18,
|
pw.white_list_archive_no AS row19,
|
pw.sheet_count AS row20,
|
pw.financial_receiver AS row21,
|
pw.input_time AS row22,
|
pw.input_person AS row23,
|
pw.input_time AS row24,
|
YEAR(pw.input_time) AS row25,
|
pw.license_plate AS row26,
|
pw.category_22 AS row27,
|
-- 额外增加用于递归的当前年份字段
|
YEAR(pfd.start_time) AS current_year,
|
YEAR(pfd.end_time) AS end_year,
|
-- 保留原始的start_time和end_time用于后续计算
|
pfd.start_time AS original_start,
|
pfd.end_time AS original_end
|
FROM pay_fee_detail pfd
|
LEFT JOIN s_community bc ON bc.community_id = pfd.community_id
|
LEFT JOIN pay_fee pf ON pf.fee_id = pfd.fee_id
|
LEFT JOIN building_room br ON br.room_id = pf.payer_obj_id
|
left join building_unit bu on br.unit_id = bu.unit_id
|
left join f_floor ff on ff.floor_id = bu.floor_id
|
LEFT JOIN pay_fee_config pfc ON pf.config_id = pfc.config_id
|
LEFT JOIN property_white_list_flow pw
|
ON DATE(pfd.create_time) = pw.charge_time
|
AND pfd.start_time = pw.charge_start
|
AND pfd.cashier_name = pw.charger
|
AND pw.door_room_num = CONCAT(ff.floor_num,'-',br.door_room_num)
|
WHERE pfd.state = 1400 and pf.payer_obj_type = '3333'
|
<if test="communityId != null">
|
and pfd.community_id = #{communityId}
|
</if>
|
|
UNION ALL
|
|
-- 递归查询:生成中间年份记录,保持所有字段一致
|
SELECT
|
row1,
|
row2,
|
row3,
|
row4,
|
row5,
|
row6,
|
row7,
|
row8,
|
row9,
|
row10,
|
row11,
|
row12,
|
row13,
|
row14,
|
row15,
|
row16,
|
row17,
|
row18,
|
row19,
|
row20,
|
row21,
|
row22,
|
row23,
|
row24,
|
row25,
|
row26,
|
row27,
|
current_year + 1 AS current_year, -- 年份递增
|
end_year,
|
original_start,
|
original_end
|
FROM year_ranges
|
WHERE current_year + 1 <= end_year -- 递归终止条件
|
|
)
|
|
-- 最终查询:拆分时间区间并展示结果
|
SELECT
|
ROW_NUMBER() OVER () as row1,
|
row2,
|
ROW_NUMBER() OVER () as row3,
|
row4,
|
row5,
|
row6,
|
row7,
|
-- 显示当年的时间范围
|
CONCAT(
|
CASE WHEN current_year = YEAR(original_start) THEN original_start
|
ELSE STR_TO_DATE(CONCAT(current_year, '-01-01'), '%Y-%m-%d') END,
|
' 至 ',
|
CASE WHEN current_year = YEAR(original_end) THEN original_end
|
ELSE STR_TO_DATE(CONCAT(current_year, '-12-31'), '%Y-%m-%d') END
|
) AS row9,
|
current_year AS row8, -- 替换为当前年份
|
row10 as row9,
|
row11 as row10,
|
row12 as row11,
|
row13 as row12,
|
row14 as row13,
|
row15 as row14,
|
row16 as row15,
|
row17 as row16,
|
row18 as row17,
|
row19 as row18,
|
row20 as row19,
|
row21 as row20,
|
row22 as row21,
|
row23 as row22,
|
row24 as row23,
|
row25 as row24,
|
row26 as row25,
|
null as row26,
|
null as row27,
|
row27 as row28,
|
null as row29,
|
null as row30
|
FROM year_ranges
|
ORDER BY row3, current_year -- 按原始记录顺序和年份排序
|
|
<if test="page != -1 and page != null ">
|
limit #{page}, #{row}
|
</if>;
|
|
|
</select>
|
|
<insert id="saveReport" parameterType="Map">
|
INSERT INTO report_query_record (
|
id,
|
refresh_time,
|
end_year,
|
community_id,
|
community_name,
|
report_content,
|
operator,
|
operator_id,
|
query_status,
|
create_time,
|
update_time
|
) VALUES (
|
#{id},
|
now(),
|
#{endYear},
|
#{communityId},
|
null,
|
#{reportContent},
|
#{operator},
|
null,
|
#{queryStatus},
|
now(),
|
now()
|
)
|
</insert>
|
<select id="queryReport" resultType="java.util.Map">
|
SELECT
|
id,
|
refresh_time AS refreshTime,
|
end_year AS endYear,
|
community_id AS communityId,
|
community_name AS communityName,
|
report_content AS reportContent,
|
operator,
|
operator_id AS operatorId,
|
query_status AS queryStatus,
|
create_time AS createTime,
|
update_time AS updateTime
|
FROM report_query_record
|
WHERE 1 = 1
|
<if test="communityId != null and communityId != ''">
|
AND community_id = #{communityId}
|
</if>
|
<if test="endYear != null and endYear != ''">
|
AND end_year = #{endYear}
|
</if>
|
<if test="operator != null and operator != ''">
|
AND operator = #{operator}
|
</if>
|
<if test="queryStatus != null and queryStatus != ''">
|
AND query_status = #{queryStatus}
|
</if>
|
<if test="operatorId != null and operatorId != ''">
|
AND operator_id = #{operatorId}
|
</if>
|
<if test="startTime != null and startTime != ''">
|
AND create_time >= #{startTime}
|
</if>
|
<if test="endTime != null and endTime != ''">
|
AND create_time <= #{endTime}
|
</if>
|
ORDER BY create_time DESC
|
<if test="pageNum != null and pageSize != null">
|
LIMIT #{pageNum}, #{pageSize}
|
</if>
|
</select>
|
|
<select id="onceRoomFee" resultType="java.util.Map">
|
WITH year_series AS (
|
-- 生成2016-2025年完整年份序列
|
SELECT 2016 + n AS year
|
FROM (
|
SELECT 0 AS n UNION SELECT 1 UNION SELECT 2 UNION SELECT 3 UNION SELECT 4
|
UNION SELECT 5 UNION SELECT 6 UNION SELECT 7 UNION SELECT 8 UNION SELECT 9
|
) AS nums
|
),
|
base_data AS (
|
-- 基础数据:仅保留确认存在的核心字段
|
SELECT
|
pf.fee_id AS 费用编号,
|
pfc.fee_name AS 费用名称,
|
pfc.fee_type_cd AS 费用类型编码,
|
pf.payer_obj_id AS 房屋ID,
|
pf.start_time AS 费用起始时间,
|
pf.end_time AS 费用截止时间,
|
STR_TO_DATE(pfa.`value`, '%Y-%m-%d') AS 应缴截止日期,
|
pfc.square_price AS 单价,
|
br.built_up_area AS 建筑面积,
|
pfc.square_price * br.built_up_area AS 每月费用标准,
|
ys.year AS 统计年份,
|
STR_TO_DATE(CONCAT(ys.year, '-01-01'), '%Y-%m-%d') AS 当年1月1日,
|
STR_TO_DATE(CONCAT(ys.year, '-12-31'), '%Y-%m-%d') AS 当年12月31日
|
FROM pay_fee pf
|
INNER JOIN pay_fee_config pfc
|
ON pf.config_id = pfc.config_id
|
AND pfc.square_price > 0
|
INNER JOIN building_room br
|
ON pf.payer_obj_id = br.room_id
|
INNER JOIN pay_fee_attrs pfa
|
ON pf.fee_id = pfa.fee_id
|
AND pfa.spec_cd = '390010'
|
INNER JOIN year_series ys ON 1=1
|
WHERE pf.payer_obj_id = #{payObjId}
|
<if test="feeTypeCd = null">
|
AND pf.fee_type_cd IN ('630000001')
|
</if>
|
<if test="feeTypeCd != null">
|
<choose>
|
<when test="feeTypeCd = '3333'">
|
AND pf.payer_obj_type = '3333'
|
</when>
|
<when test="feeTypeCd = '6666'">
|
AND pf.payer_obj_type = '6666'
|
</when>
|
<when test="feeTypeCd = '7777'">
|
AND pf.payer_obj_type = '7777'
|
</when>
|
<otherwise>
|
and pf.fee_type_cd = ${feeTypeCd}
|
</otherwise>
|
</choose>
|
</if>
|
AND pf.status_cd = '0'
|
),
|
detail_agg AS (
|
-- 明细汇总:核心修正→已收月数/金额仅统计received_amount>0的记录
|
SELECT
|
bd.费用编号,
|
bd.统计年份,
|
COUNT(DISTINCT CASE
|
WHEN pfdm.detail_year = bd.统计年份
|
AND pfdm.status_cd = '0'
|
AND pfdm.received_amount > 0
|
THEN CONCAT(pfdm.detail_year, '-', LPAD(pfdm.detail_month, 2, '0'))
|
END) AS 当年已收月数,
|
SUM(CASE
|
WHEN pfdm.detail_year = bd.统计年份
|
AND pfdm.status_cd = '0'
|
AND pfdm.received_amount > 0
|
THEN pfdm.received_amount
|
ELSE 0
|
END) AS 当年实收金额,
|
SUM(CASE
|
WHEN pfdm.detail_year = bd.统计年份
|
AND pfdm.status_cd = '0'
|
AND pfdm.received_amount > 0
|
THEN pfdm.discount_amount
|
ELSE 0
|
END) AS 当年折扣金额
|
FROM base_data bd
|
LEFT JOIN pay_fee_detail_month pfdm
|
ON bd.费用编号 = pfdm.fee_id
|
AND pfdm.obj_id = bd.房屋ID
|
GROUP BY bd.费用编号, bd.统计年份
|
),
|
calculated_data AS (
|
-- 计算衍生字段:应收月数、区间等
|
SELECT
|
bd.费用编号,
|
bd.费用名称,
|
bd.费用类型编码,
|
bd.房屋ID,
|
bd.统计年份,
|
bd.每月费用标准,
|
-- 应收月数
|
CASE
|
WHEN GREATEST(bd.费用起始时间, bd.当年1月1日) >
|
LEAST(bd.应缴截止日期, bd.当年12月31日)
|
THEN 0
|
ELSE TIMESTAMPDIFF(
|
MONTH,
|
GREATEST(bd.费用起始时间, bd.当年1月1日),
|
LEAST(bd.应缴截止日期, bd.当年12月31日)
|
) + 1
|
END AS 当年应收月数,
|
-- 应收金额
|
(CASE
|
WHEN GREATEST(bd.费用起始时间, bd.当年1月1日) >
|
LEAST(bd.应缴截止日期, bd.当年12月31日)
|
THEN 0
|
ELSE TIMESTAMPDIFF(
|
MONTH,
|
GREATEST(bd.费用起始时间, bd.当年1月1日),
|
LEAST(bd.应缴截止日期, bd.当年12月31日)
|
) + 1
|
END) * bd.每月费用标准 AS 当年应收金额,
|
-- 已收区间起始/截止日
|
CASE
|
WHEN bd.费用起始时间 > bd.当年12月31日 THEN NULL
|
WHEN bd.费用截止时间 < bd.当年1月1日 THEN NULL
|
ELSE GREATEST(bd.费用起始时间, bd.当年1月1日)
|
END AS 当年已收起始日,
|
CASE
|
WHEN bd.费用起始时间 > bd.当年12月31日 THEN NULL
|
WHEN bd.费用截止时间 < bd.当年1月1日 THEN NULL
|
ELSE LEAST(bd.费用截止时间, bd.当年12月31日)
|
END AS 当年已收截止日,
|
-- 未收区间起始/截止日
|
CASE
|
WHEN bd.应缴截止日期 < bd.当年1月1日 THEN NULL
|
WHEN bd.费用截止时间 > bd.当年12月31日 THEN NULL
|
ELSE GREATEST(bd.费用截止时间, bd.当年1月1日)
|
END AS 当年未收起始日,
|
CASE
|
WHEN bd.应缴截止日期 < bd.当年1月1日 THEN NULL
|
WHEN bd.费用截止时间 > bd.当年12月31日 THEN NULL
|
ELSE LEAST(bd.应缴截止日期, bd.当年12月31日)
|
END AS 当年未收截止日,
|
-- 明细数据
|
COALESCE(da.当年已收月数, 0) AS 当年已收月数,
|
COALESCE(da.当年实收金额, 0) AS 当年实收金额,
|
COALESCE(da.当年折扣金额, 0) AS 当年折扣金额,
|
-- 应收区间相关计算字段
|
GREATEST(bd.费用起始时间, bd.当年1月1日) AS 原始应收起始日,
|
LEAST(bd.应缴截止日期, bd.当年12月31日) AS 原始应收截止日,
|
bd.当年12月31日 AS 当年年末日,
|
-- 原始应收区间
|
CASE
|
WHEN GREATEST(bd.费用起始时间, bd.当年1月1日) <=
|
LEAST(bd.应缴截止日期, bd.当年12月31日)
|
THEN CONCAT(
|
DATE_FORMAT(GREATEST(bd.费用起始时间, bd.当年1月1日), '%Y-%m-%d'),
|
' ~ ',
|
DATE_FORMAT(LEAST(bd.应缴截止日期, bd.当年12月31日), '%Y-%m-%d')
|
)
|
ELSE NULL
|
END AS 原始应收区间,
|
-- 补充应收区间
|
CASE
|
WHEN (GREATEST(bd.费用起始时间, bd.当年1月1日) >
|
LEAST(bd.应缴截止日期, bd.当年12月31日))
|
AND (CASE
|
WHEN GREATEST(bd.费用起始时间, bd.当年1月1日) >
|
LEAST(bd.应缴截止日期, bd.当年12月31日)
|
THEN 0
|
ELSE TIMESTAMPDIFF(
|
MONTH,
|
GREATEST(bd.费用起始时间, bd.当年1月1日),
|
LEAST(bd.应缴截止日期, bd.当年12月31日)
|
) + 1
|
END) > 0
|
THEN CONCAT(
|
DATE_FORMAT(DATE_SUB(bd.当年12月31日, INTERVAL (CASE
|
WHEN GREATEST(bd.费用起始时间, bd.当年1月1日) >
|
LEAST(bd.应缴截止日期, bd.当年12月31日)
|
THEN 0
|
ELSE TIMESTAMPDIFF(
|
MONTH,
|
GREATEST(bd.费用起始时间, bd.当年1月1日),
|
LEAST(bd.应缴截止日期, bd.当年12月31日)
|
) + 1
|
END) - 1 MONTH), '%Y-%m-%d'),
|
' ~ ',
|
DATE_FORMAT(bd.当年12月31日, '%Y-%m-%d')
|
)
|
ELSE NULL
|
END AS 补充应收区间
|
FROM base_data bd
|
LEFT JOIN detail_agg da
|
ON bd.费用编号 = da.费用编号
|
AND bd.统计年份 = da.统计年份
|
),
|
grouped_data AS (
|
-- 1. 各年份明细数据
|
SELECT
|
费用编号,
|
费用名称,
|
费用类型编码,
|
房屋ID,
|
CONCAT(统计年份, '年') AS 统计维度,
|
统计年份 AS 排序辅助,
|
当年应收月数 AS 应收月数,
|
当年已收月数 AS 已收月数,
|
CASE
|
WHEN 原始应收区间 IS NOT NULL THEN 原始应收区间
|
WHEN 当年应收月数 > 0 THEN 补充应收区间
|
ELSE NULL
|
END AS 应收区间,
|
CASE
|
WHEN 当年已收起始日 IS NOT NULL AND 当年已收截止日 IS NOT NULL
|
AND 当年已收月数 > 0
|
THEN CONCAT(DATE_FORMAT(当年已收起始日, '%Y-%m-%d'), ' ~ ', DATE_FORMAT(当年已收截止日, '%Y-%m-%d'))
|
ELSE NULL
|
END AS 已收区间,
|
CASE
|
WHEN 当年未收起始日 IS NOT NULL AND 当年未收截止日 IS NOT NULL
|
AND 当年应收月数 > 当年已收月数
|
THEN CONCAT(DATE_FORMAT(当年未收起始日, '%Y-%m-%d'), ' ~ ', DATE_FORMAT(当年未收截止日, '%Y-%m-%d'))
|
ELSE NULL
|
END AS 未收区间,
|
当年应收金额 AS 应收金额,
|
当年实收金额 AS 实收金额,
|
当年折扣金额 AS 折扣金额
|
FROM calculated_data
|
WHERE 统计年份 BETWEEN 2016 AND 2025
|
|
UNION ALL
|
|
-- 2. 2020年单独汇总
|
SELECT
|
费用编号,
|
费用名称,
|
费用类型编码,
|
房屋ID,
|
'2020年' AS 统计维度,
|
2020 AS 排序辅助,
|
SUM(当年应收月数) AS 应收月数,
|
SUM(当年已收月数) AS 已收月数,
|
CASE
|
WHEN SUM(当年应收月数) > 0 THEN CONCAT(
|
DATE_FORMAT(MIN(CASE
|
WHEN 原始应收起始日 <= 原始应收截止日 THEN 原始应收起始日
|
ELSE DATE_SUB(当年年末日, INTERVAL (当年应收月数 - 1) MONTH)
|
END), '%Y-%m-%d'),
|
' ~ ',
|
DATE_FORMAT(MAX(CASE
|
WHEN 原始应收起始日 <= 原始应收截止日 THEN 原始应收截止日
|
ELSE 当年年末日
|
END), '%Y-%m-%d')
|
)
|
ELSE NULL
|
END AS 应收区间,
|
CASE
|
WHEN MIN(当年已收起始日) IS NOT NULL AND MAX(当年已收截止日) IS NOT NULL
|
AND SUM(当年已收月数) > 0
|
THEN CONCAT(DATE_FORMAT(MIN(当年已收起始日), '%Y-%m-%d'), ' ~ ', DATE_FORMAT(MAX(当年已收截止日), '%Y-%m-%d'))
|
ELSE NULL
|
END AS 已收区间,
|
CASE
|
WHEN MIN(当年未收起始日) IS NOT NULL AND MAX(当年未收截止日) IS NOT NULL
|
AND SUM(当年应收月数) > SUM(当年已收月数)
|
THEN CONCAT(DATE_FORMAT(MIN(当年未收起始日), '%Y-%m-%d'), ' ~ ', DATE_FORMAT(MAX(当年未收截止日), '%Y-%m-%d'))
|
ELSE NULL
|
END AS 未收区间,
|
SUM(当年应收金额) AS 应收金额,
|
SUM(当年实收金额) AS 实收金额,
|
SUM(当年折扣金额) AS 折扣金额
|
FROM calculated_data
|
WHERE 统计年份 = 2020
|
GROUP BY 费用编号, 费用名称, 费用类型编码, 房屋ID, 统计维度, 排序辅助
|
|
UNION ALL
|
|
-- 3. 2016-2025年合计
|
SELECT
|
费用编号,
|
费用名称,
|
费用类型编码,
|
房屋ID,
|
'2016-2025年合计' AS 统计维度,
|
9999 AS 排序辅助,
|
SUM(当年应收月数) AS 应收月数,
|
SUM(当年已收月数) AS 已收月数,
|
CASE
|
WHEN SUM(当年应收月数) > 0 THEN CONCAT(
|
DATE_FORMAT(MIN(CASE
|
WHEN 原始应收起始日 <= 原始应收截止日 THEN 原始应收起始日
|
ELSE DATE_SUB(当年年末日, INTERVAL (当年应收月数 - 1) MONTH)
|
END), '%Y-%m-%d'),
|
' ~ ',
|
DATE_FORMAT(MAX(CASE
|
WHEN 原始应收起始日 <= 原始应收截止日 THEN 原始应收截止日
|
ELSE 当年年末日
|
END), '%Y-%m-%d')
|
)
|
ELSE NULL
|
END AS 应收区间,
|
CASE
|
WHEN MIN(当年已收起始日) IS NOT NULL AND MAX(当年已收截止日) IS NOT NULL
|
AND SUM(当年已收月数) > 0
|
THEN CONCAT(DATE_FORMAT(MIN(当年已收起始日), '%Y-%m-%d'), ' ~ ', DATE_FORMAT(MAX(当年已收截止日), '%Y-%m-%d'))
|
ELSE NULL
|
END AS 已收区间,
|
CASE
|
WHEN MIN(当年未收起始日) IS NOT NULL AND MAX(当年未收截止日) IS NOT NULL
|
AND SUM(当年应收月数) > SUM(当年已收月数)
|
THEN CONCAT(DATE_FORMAT(MIN(当年未收起始日), '%Y-%m-%d'), ' ~ ', DATE_FORMAT(MAX(当年未收截止日), '%Y-%m-%d'))
|
ELSE NULL
|
END AS 未收区间,
|
SUM(当年应收金额) AS 应收金额,
|
SUM(当年实收金额) AS 实收金额,
|
SUM(当年折扣金额) AS 折扣金额
|
FROM calculated_data
|
WHERE 统计年份 BETWEEN 2016 AND 2025
|
GROUP BY 费用编号, 费用名称, 费用类型编码, 房屋ID, 统计维度, 排序辅助
|
)
|
-- 最终结果输出
|
SELECT DISTINCT
|
费用编号,
|
费用名称,
|
费用类型编码,
|
房屋ID,
|
统计维度,
|
应收月数,
|
已收月数,
|
(应收月数 - 已收月数) as 未收月数,
|
应收区间,
|
已收区间,
|
未收区间,
|
应收金额,
|
实收金额,
|
折扣金额,
|
(应收金额 - 实收金额 - 折扣金额) as 未收金额
|
FROM grouped_data
|
WHERE 应收金额 != 0
|
ORDER BY
|
费用编号;
|
|
</select>
|
</mapper>
|