diff --git a/daxpay-payment/daxpay-payment-admin/src/main/java/cn/daxpay/open/payment/admin/dao/dashboard/AdminTradeReportMapper.java b/daxpay-payment/daxpay-payment-admin/src/main/java/cn/daxpay/open/payment/admin/dao/dashboard/AdminTradeReportMapper.java index 0a19a26f6..c72c87cda 100644 --- a/daxpay-payment/daxpay-payment-admin/src/main/java/cn/daxpay/open/payment/admin/dao/dashboard/AdminTradeReportMapper.java +++ b/daxpay-payment/daxpay-payment-admin/src/main/java/cn/daxpay/open/payment/admin/dao/dashboard/AdminTradeReportMapper.java @@ -32,126 +32,146 @@ public interface AdminTradeReportMapper extends MPJBaseMapper { // ===== 概览 ===== /// 成交聚合: 按 pay_time 过滤, 填充 success_amount / success_count - @Select("SELECT COALESCE(SUM(posted_amount), 0)::bigint AS success_amount, " - + "COUNT(*)::bigint AS success_count " - + "FROM pay_trade " - + "WHERE status = 'success' AND posted_amount > 0 " - + "AND pay_time >= #{start} AND pay_time < #{end}") + @Select(""" + SELECT COALESCE(SUM(posted_amount), 0)::bigint AS success_amount, + COUNT(*)::bigint AS success_count + FROM pay_trade + WHERE status = 'success' AND posted_amount > 0 + AND pay_time >= #{start} AND pay_time < #{end} + """) TradeOverviewResult successAggregate( @Param("start") OffsetDateTime start, @Param("end") OffsetDateTime end); /// 总下单笔数聚合: 按 create_time 过滤, 填充 total_orders - @Select("SELECT COUNT(*)::bigint AS total_orders " - + "FROM pay_trade " - + "WHERE create_time >= #{start} AND create_time < #{end}") + @Select(""" + SELECT COUNT(*)::bigint AS total_orders + FROM pay_trade + WHERE create_time >= #{start} AND create_time < #{end} + """) TradeOverviewResult totalOrdersAggregate( @Param("start") OffsetDateTime start, @Param("end") OffsetDateTime end); /// 退款聚合 - @Select("SELECT COALESCE(SUM(amount), 0)::bigint AS refund_amount, " - + "COUNT(*)::bigint AS refund_count " - + "FROM pay_refund_order " - + "WHERE status = 'success' " - + "AND finish_time >= #{start} AND finish_time < #{end}") + @Select(""" + SELECT COALESCE(SUM(amount), 0)::bigint AS refund_amount, + COUNT(*)::bigint AS refund_count + FROM pay_refund_order + WHERE status = 'success' + AND finish_time >= #{start} AND finish_time < #{end} + """) TradeOverviewResult refundAggregate( @Param("start") OffsetDateTime start, @Param("end") OffsetDateTime end); // ===== 趋势 ===== - @Select("SELECT TO_CHAR(pay_time AT TIME ZONE 'Asia/Shanghai', 'YYYY-MM-DD') AS date, " - + "COALESCE(SUM(posted_amount), 0)::bigint AS amount, " - + "COUNT(*)::bigint AS count " - + "FROM pay_trade " - + "WHERE status = 'success' AND posted_amount > 0 " - + "AND pay_time >= #{start} AND pay_time < #{end} " - + "GROUP BY 1 ORDER BY 1") + @Select(""" + SELECT TO_CHAR(pay_time AT TIME ZONE 'Asia/Shanghai', 'YYYY-MM-DD') AS date, + COALESCE(SUM(posted_amount), 0)::bigint AS amount, + COUNT(*)::bigint AS count + FROM pay_trade + WHERE status = 'success' AND posted_amount > 0 + AND pay_time >= #{start} AND pay_time < #{end} + GROUP BY 1 ORDER BY 1 + """) List trend( @Param("start") OffsetDateTime start, @Param("end") OffsetDateTime end); - @Select("SELECT TO_CHAR(finish_time AT TIME ZONE 'Asia/Shanghai', 'YYYY-MM-DD') AS date, " - + "COALESCE(SUM(amount), 0)::bigint AS amount, " - + "COUNT(*)::bigint AS count " - + "FROM pay_refund_order " - + "WHERE status = 'success' " - + "AND finish_time >= #{start} AND finish_time < #{end} " - + "GROUP BY 1 ORDER BY 1") + @Select(""" + SELECT TO_CHAR(finish_time AT TIME ZONE 'Asia/Shanghai', 'YYYY-MM-DD') AS date, + COALESCE(SUM(amount), 0)::bigint AS amount, + COUNT(*)::bigint AS count + FROM pay_refund_order + WHERE status = 'success' + AND finish_time >= #{start} AND finish_time < #{end} + GROUP BY 1 ORDER BY 1 + """) List refundTrend( @Param("start") OffsetDateTime start, @Param("end") OffsetDateTime end); // ===== 渠道分布 ===== - @Select("SELECT provider, " - + "COALESCE(SUM(posted_amount), 0)::bigint AS amount, " - + "COUNT(*)::bigint AS count " - + "FROM pay_trade " - + "WHERE status = 'success' AND posted_amount > 0 " - + "AND provider IS NOT NULL " - + "AND pay_time >= #{start} AND pay_time < #{end} " - + "GROUP BY provider ORDER BY amount DESC") + @Select(""" + SELECT provider, + COALESCE(SUM(posted_amount), 0)::bigint AS amount, + COUNT(*)::bigint AS count + FROM pay_trade + WHERE status = 'success' AND posted_amount > 0 + AND provider IS NOT NULL + AND pay_time >= #{start} AND pay_time < #{end} + GROUP BY provider ORDER BY amount DESC + """) List providerDist( @Param("start") OffsetDateTime start, @Param("end") OffsetDateTime end); - @Select("SELECT provider, " - + "ROUND(COUNT(*) FILTER (WHERE status = 'success' AND posted_amount > 0)::numeric " - + " / NULLIF(COUNT(*), 0) * 100, 1) AS rate " - + "FROM pay_trade " - + "WHERE provider IS NOT NULL " - + "AND create_time >= #{start} AND create_time < #{end} " - + "GROUP BY provider " - + "HAVING COUNT(*) > 0 " - + "ORDER BY rate DESC") + @Select(""" + SELECT provider, + ROUND(COUNT(*) FILTER (WHERE status = 'success' AND posted_amount > 0)::numeric + / NULLIF(COUNT(*), 0) * 100, 1) AS rate + FROM pay_trade + WHERE provider IS NOT NULL + AND create_time >= #{start} AND create_time < #{end} + GROUP BY provider + HAVING COUNT(*) > 0 + ORDER BY rate DESC + """) List providerSuccess( @Param("start") OffsetDateTime start, @Param("end") OffsetDateTime end); // ===== 时段分布 ===== - @Select("SELECT EXTRACT(HOUR FROM pay_time AT TIME ZONE 'Asia/Shanghai')::int AS hour, " - + "COALESCE(SUM(posted_amount), 0)::bigint AS amount, " - + "COUNT(*)::bigint AS count " - + "FROM pay_trade " - + "WHERE status = 'success' AND posted_amount > 0 " - + "AND pay_time >= #{start} AND pay_time < #{end} " - + "GROUP BY 1 ORDER BY 1") + @Select(""" + SELECT EXTRACT(HOUR FROM pay_time AT TIME ZONE 'Asia/Shanghai')::int AS hour, + COALESCE(SUM(posted_amount), 0)::bigint AS amount, + COUNT(*)::bigint AS count + FROM pay_trade + WHERE status = 'success' AND posted_amount > 0 + AND pay_time >= #{start} AND pay_time < #{end} + GROUP BY 1 ORDER BY 1 + """) List hourlyDist( @Param("start") OffsetDateTime start, @Param("end") OffsetDateTime end); // ===== 金额区间分桶 ===== - @Select("SELECT CASE " - + "WHEN amount < 5000 THEN '0-50' " - + "WHEN amount < 20000 THEN '50-200' " - + "WHEN amount < 100000 THEN '200-1000' " - + "WHEN amount < 500000 THEN '1000-5000' " - + "ELSE '5000+' END AS bucket, " - + "COUNT(*)::bigint AS count " - + "FROM pay_trade " - + "WHERE status = 'success' AND posted_amount > 0 " - + "AND pay_time >= #{start} AND pay_time < #{end} " - + "GROUP BY 1") + @Select(""" + SELECT CASE + WHEN amount < 5000 THEN '0-50' + WHEN amount < 20000 THEN '50-200' + WHEN amount < 100000 THEN '200-1000' + WHEN amount < 500000 THEN '1000-5000' + ELSE '5000+' END AS bucket, + COUNT(*)::bigint AS count + FROM pay_trade + WHERE status = 'success' AND posted_amount > 0 + AND pay_time >= #{start} AND pay_time < #{end} + GROUP BY 1 + """) List amountRange( @Param("start") OffsetDateTime start, @Param("end") OffsetDateTime end); // ===== 商户排名 ===== - @Select("SELECT t.mch_no AS mchNo, m.mch_name AS merchantName, " - + "COALESCE(SUM(t.posted_amount), 0)::bigint AS amount, " - + "COUNT(*)::bigint AS orders " - + "FROM pay_trade t " - + "LEFT JOIN mch_info m ON m.mch_no = t.mch_no AND m.deleted = false " - + "WHERE t.status = 'success' AND t.posted_amount > 0 " - + "AND t.pay_time >= #{start} AND t.pay_time < #{end} " - + "GROUP BY t.mch_no, m.mch_name " - + "ORDER BY amount DESC " - + "LIMIT #{limit}") + @Select(""" + SELECT t.mch_no AS mchNo, m.mch_name AS merchantName, + COALESCE(SUM(t.posted_amount), 0)::bigint AS amount, + COUNT(*)::bigint AS orders + FROM pay_trade t + LEFT JOIN mch_info m ON m.mch_no = t.mch_no AND m.deleted = false + WHERE t.status = 'success' AND t.posted_amount > 0 + AND t.pay_time >= #{start} AND t.pay_time < #{end} + GROUP BY t.mch_no, m.mch_name + ORDER BY amount DESC + LIMIT #{limit} + """) List merchantRank( @Param("start") OffsetDateTime start, @Param("end") OffsetDateTime end, diff --git a/daxpay-payment/daxpay-payment-merchant/src/main/java/cn/daxpay/open/payment/merchant/dao/dashboard/MchTradeReportMapper.java b/daxpay-payment/daxpay-payment-merchant/src/main/java/cn/daxpay/open/payment/merchant/dao/dashboard/MchTradeReportMapper.java index 322187990..50732699c 100644 --- a/daxpay-payment/daxpay-payment-merchant/src/main/java/cn/daxpay/open/payment/merchant/dao/dashboard/MchTradeReportMapper.java +++ b/daxpay-payment/daxpay-payment-merchant/src/main/java/cn/daxpay/open/payment/merchant/dao/dashboard/MchTradeReportMapper.java @@ -32,34 +32,40 @@ public interface MchTradeReportMapper extends MPJBaseMapper { // ===== 概览 ===== /// 成交聚合: 按 pay_time 过滤, 填充 success_amount / success_count - @Select("SELECT COALESCE(SUM(posted_amount), 0)::bigint AS success_amount, " - + "COUNT(*)::bigint AS success_count " - + "FROM pay_trade " - + "WHERE status = 'success' AND posted_amount > 0 " - + "AND pay_time >= #{start} AND pay_time < #{end} " - + "AND mch_no = #{mchNo}") + @Select(""" + SELECT COALESCE(SUM(posted_amount), 0)::bigint AS success_amount, + COUNT(*)::bigint AS success_count + FROM pay_trade + WHERE status = 'success' AND posted_amount > 0 + AND pay_time >= #{start} AND pay_time < #{end} + AND mch_no = #{mchNo} + """) TradeOverviewResult successAggregate( @Param("start") OffsetDateTime start, @Param("end") OffsetDateTime end, @Param("mchNo") String mchNo); /// 总下单笔数聚合: 按 create_time 过滤, 填充 total_orders - @Select("SELECT COUNT(*)::bigint AS total_orders " - + "FROM pay_trade " - + "WHERE create_time >= #{start} AND create_time < #{end} " - + "AND mch_no = #{mchNo}") + @Select(""" + SELECT COUNT(*)::bigint AS total_orders + FROM pay_trade + WHERE create_time >= #{start} AND create_time < #{end} + AND mch_no = #{mchNo} + """) TradeOverviewResult totalOrdersAggregate( @Param("start") OffsetDateTime start, @Param("end") OffsetDateTime end, @Param("mchNo") String mchNo); /// 退款聚合 - @Select("SELECT COALESCE(SUM(amount), 0)::bigint AS refund_amount, " - + "COUNT(*)::bigint AS refund_count " - + "FROM pay_refund_order " - + "WHERE status = 'success' " - + "AND finish_time >= #{start} AND finish_time < #{end} " - + "AND mch_no = #{mchNo}") + @Select(""" + SELECT COALESCE(SUM(amount), 0)::bigint AS refund_amount, + COUNT(*)::bigint AS refund_count + FROM pay_refund_order + WHERE status = 'success' + AND finish_time >= #{start} AND finish_time < #{end} + AND mch_no = #{mchNo} + """) TradeOverviewResult refundAggregate( @Param("start") OffsetDateTime start, @Param("end") OffsetDateTime end, @@ -67,27 +73,31 @@ public interface MchTradeReportMapper extends MPJBaseMapper { // ===== 趋势 ===== - @Select("SELECT TO_CHAR(pay_time AT TIME ZONE 'Asia/Shanghai', 'YYYY-MM-DD') AS date, " - + "COALESCE(SUM(posted_amount), 0)::bigint AS amount, " - + "COUNT(*)::bigint AS count " - + "FROM pay_trade " - + "WHERE status = 'success' AND posted_amount > 0 " - + "AND pay_time >= #{start} AND pay_time < #{end} " - + "AND mch_no = #{mchNo} " - + "GROUP BY 1 ORDER BY 1") + @Select(""" + SELECT TO_CHAR(pay_time AT TIME ZONE 'Asia/Shanghai', 'YYYY-MM-DD') AS date, + COALESCE(SUM(posted_amount), 0)::bigint AS amount, + COUNT(*)::bigint AS count + FROM pay_trade + WHERE status = 'success' AND posted_amount > 0 + AND pay_time >= #{start} AND pay_time < #{end} + AND mch_no = #{mchNo} + GROUP BY 1 ORDER BY 1 + """) List trend( @Param("start") OffsetDateTime start, @Param("end") OffsetDateTime end, @Param("mchNo") String mchNo); - @Select("SELECT TO_CHAR(finish_time AT TIME ZONE 'Asia/Shanghai', 'YYYY-MM-DD') AS date, " - + "COALESCE(SUM(amount), 0)::bigint AS amount, " - + "COUNT(*)::bigint AS count " - + "FROM pay_refund_order " - + "WHERE status = 'success' " - + "AND finish_time >= #{start} AND finish_time < #{end} " - + "AND mch_no = #{mchNo} " - + "GROUP BY 1 ORDER BY 1") + @Select(""" + SELECT TO_CHAR(finish_time AT TIME ZONE 'Asia/Shanghai', 'YYYY-MM-DD') AS date, + COALESCE(SUM(amount), 0)::bigint AS amount, + COUNT(*)::bigint AS count + FROM pay_refund_order + WHERE status = 'success' + AND finish_time >= #{start} AND finish_time < #{end} + AND mch_no = #{mchNo} + GROUP BY 1 ORDER BY 1 + """) List refundTrend( @Param("start") OffsetDateTime start, @Param("end") OffsetDateTime end, @@ -95,30 +105,34 @@ public interface MchTradeReportMapper extends MPJBaseMapper { // ===== 渠道分布 ===== - @Select("SELECT provider, " - + "COALESCE(SUM(posted_amount), 0)::bigint AS amount, " - + "COUNT(*)::bigint AS count " - + "FROM pay_trade " - + "WHERE status = 'success' AND posted_amount > 0 " - + "AND provider IS NOT NULL " - + "AND pay_time >= #{start} AND pay_time < #{end} " - + "AND mch_no = #{mchNo} " - + "GROUP BY provider ORDER BY amount DESC") + @Select(""" + SELECT provider, + COALESCE(SUM(posted_amount), 0)::bigint AS amount, + COUNT(*)::bigint AS count + FROM pay_trade + WHERE status = 'success' AND posted_amount > 0 + AND provider IS NOT NULL + AND pay_time >= #{start} AND pay_time < #{end} + AND mch_no = #{mchNo} + GROUP BY provider ORDER BY amount DESC + """) List providerDist( @Param("start") OffsetDateTime start, @Param("end") OffsetDateTime end, @Param("mchNo") String mchNo); - @Select("SELECT provider, " - + "ROUND(COUNT(*) FILTER (WHERE status = 'success' AND posted_amount > 0)::numeric " - + " / NULLIF(COUNT(*), 0) * 100, 1) AS rate " - + "FROM pay_trade " - + "WHERE provider IS NOT NULL " - + "AND create_time >= #{start} AND create_time < #{end} " - + "AND mch_no = #{mchNo} " - + "GROUP BY provider " - + "HAVING COUNT(*) > 0 " - + "ORDER BY rate DESC") + @Select(""" + SELECT provider, + ROUND(COUNT(*) FILTER (WHERE status = 'success' AND posted_amount > 0)::numeric + / NULLIF(COUNT(*), 0) * 100, 1) AS rate + FROM pay_trade + WHERE provider IS NOT NULL + AND create_time >= #{start} AND create_time < #{end} + AND mch_no = #{mchNo} + GROUP BY provider + HAVING COUNT(*) > 0 + ORDER BY rate DESC + """) List providerSuccess( @Param("start") OffsetDateTime start, @Param("end") OffsetDateTime end, @@ -126,14 +140,16 @@ public interface MchTradeReportMapper extends MPJBaseMapper { // ===== 时段分布 ===== - @Select("SELECT EXTRACT(HOUR FROM pay_time AT TIME ZONE 'Asia/Shanghai')::int AS hour, " - + "COALESCE(SUM(posted_amount), 0)::bigint AS amount, " - + "COUNT(*)::bigint AS count " - + "FROM pay_trade " - + "WHERE status = 'success' AND posted_amount > 0 " - + "AND pay_time >= #{start} AND pay_time < #{end} " - + "AND mch_no = #{mchNo} " - + "GROUP BY 1 ORDER BY 1") + @Select(""" + SELECT EXTRACT(HOUR FROM pay_time AT TIME ZONE 'Asia/Shanghai')::int AS hour, + COALESCE(SUM(posted_amount), 0)::bigint AS amount, + COUNT(*)::bigint AS count + FROM pay_trade + WHERE status = 'success' AND posted_amount > 0 + AND pay_time >= #{start} AND pay_time < #{end} + AND mch_no = #{mchNo} + GROUP BY 1 ORDER BY 1 + """) List hourlyDist( @Param("start") OffsetDateTime start, @Param("end") OffsetDateTime end, @@ -141,18 +157,20 @@ public interface MchTradeReportMapper extends MPJBaseMapper { // ===== 金额区间分桶 ===== - @Select("SELECT CASE " - + "WHEN amount < 5000 THEN '0-50' " - + "WHEN amount < 20000 THEN '50-200' " - + "WHEN amount < 100000 THEN '200-1000' " - + "WHEN amount < 500000 THEN '1000-5000' " - + "ELSE '5000+' END AS bucket, " - + "COUNT(*)::bigint AS count " - + "FROM pay_trade " - + "WHERE status = 'success' AND posted_amount > 0 " - + "AND pay_time >= #{start} AND pay_time < #{end} " - + "AND mch_no = #{mchNo} " - + "GROUP BY 1") + @Select(""" + SELECT CASE + WHEN amount < 5000 THEN '0-50' + WHEN amount < 20000 THEN '50-200' + WHEN amount < 100000 THEN '200-1000' + WHEN amount < 500000 THEN '1000-5000' + ELSE '5000+' END AS bucket, + COUNT(*)::bigint AS count + FROM pay_trade + WHERE status = 'success' AND posted_amount > 0 + AND pay_time >= #{start} AND pay_time < #{end} + AND mch_no = #{mchNo} + GROUP BY 1 + """) List amountRange( @Param("start") OffsetDateTime start, @Param("end") OffsetDateTime end, @@ -161,20 +179,22 @@ public interface MchTradeReportMapper extends MPJBaseMapper { // ===== 维度排名 ===== /// 按通道商户号分组排名 - @Select("SELECT t.channel_mch_no AS dimKey, " - + "COALESCE(cm.channel_merchant_name, t.channel_mch_no) AS dimName, " - + "COALESCE(SUM(t.posted_amount), 0)::bigint AS amount, " - + "COUNT(*)::bigint AS orders " - + "FROM pay_trade t " - + "LEFT JOIN mch_channel_merchant cm " - + " ON cm.channel_mch_no = t.channel_mch_no AND cm.mch_no = t.mch_no AND cm.deleted = false " - + "WHERE t.status = 'success' AND t.posted_amount > 0 " - + "AND t.channel_mch_no IS NOT NULL AND t.channel_mch_no <> '' " - + "AND t.pay_time >= #{start} AND t.pay_time < #{end} " - + "AND t.mch_no = #{mchNo} " - + "GROUP BY t.channel_mch_no, cm.channel_merchant_name " - + "ORDER BY amount DESC " - + "LIMIT #{limit}") + @Select(""" + SELECT t.channel_mch_no AS dimKey, + COALESCE(cm.channel_merchant_name, t.channel_mch_no) AS dimName, + COALESCE(SUM(t.posted_amount), 0)::bigint AS amount, + COUNT(*)::bigint AS orders + FROM pay_trade t + LEFT JOIN mch_channel_merchant cm + ON cm.channel_mch_no = t.channel_mch_no AND cm.mch_no = t.mch_no AND cm.deleted = false + WHERE t.status = 'success' AND t.posted_amount > 0 + AND t.channel_mch_no IS NOT NULL AND t.channel_mch_no <> '' + AND t.pay_time >= #{start} AND t.pay_time < #{end} + AND t.mch_no = #{mchNo} + GROUP BY t.channel_mch_no, cm.channel_merchant_name + ORDER BY amount DESC + LIMIT #{limit} + """) List dimRankByChannelMch( @Param("start") OffsetDateTime start, @Param("end") OffsetDateTime end, @@ -182,20 +202,22 @@ public interface MchTradeReportMapper extends MPJBaseMapper { @Param("limit") int limit); /// 按应用分组排名 - @Select("SELECT t.app_id AS dimKey, " - + "COALESCE(a.app_name, t.app_id) AS dimName, " - + "COALESCE(SUM(t.posted_amount), 0)::bigint AS amount, " - + "COUNT(*)::bigint AS orders " - + "FROM pay_trade t " - + "LEFT JOIN mch_app_info a " - + " ON a.app_id = t.app_id AND a.mch_no = t.mch_no AND a.deleted = false " - + "WHERE t.status = 'success' AND t.posted_amount > 0 " - + "AND t.app_id IS NOT NULL AND t.app_id <> '' " - + "AND t.pay_time >= #{start} AND t.pay_time < #{end} " - + "AND t.mch_no = #{mchNo} " - + "GROUP BY t.app_id, a.app_name " - + "ORDER BY amount DESC " - + "LIMIT #{limit}") + @Select(""" + SELECT t.app_id AS dimKey, + COALESCE(a.app_name, t.app_id) AS dimName, + COALESCE(SUM(t.posted_amount), 0)::bigint AS amount, + COUNT(*)::bigint AS orders + FROM pay_trade t + LEFT JOIN mch_app_info a + ON a.app_id = t.app_id AND a.mch_no = t.mch_no AND a.deleted = false + WHERE t.status = 'success' AND t.posted_amount > 0 + AND t.app_id IS NOT NULL AND t.app_id <> '' + AND t.pay_time >= #{start} AND t.pay_time < #{end} + AND t.mch_no = #{mchNo} + GROUP BY t.app_id, a.app_name + ORDER BY amount DESC + LIMIT #{limit} + """) List dimRankByApp( @Param("start") OffsetDateTime start, @Param("end") OffsetDateTime end, @@ -203,19 +225,21 @@ public interface MchTradeReportMapper extends MPJBaseMapper { @Param("limit") int limit); /// 按门店分组排名; 空 store_no 归到 dimKey='' (前端展示「未指定门店」) - @Select("SELECT COALESCE(NULLIF(t.store_no, ''), '') AS dimKey, " - + "s.store_name AS dimName, " - + "COALESCE(SUM(t.posted_amount), 0)::bigint AS amount, " - + "COUNT(*)::bigint AS orders " - + "FROM pay_trade t " - + "LEFT JOIN mch_store_info s " - + " ON s.store_no = t.store_no AND s.mch_no = t.mch_no AND s.deleted = false " - + "WHERE t.status = 'success' AND t.posted_amount > 0 " - + "AND t.pay_time >= #{start} AND t.pay_time < #{end} " - + "AND t.mch_no = #{mchNo} " - + "GROUP BY COALESCE(NULLIF(t.store_no, ''), ''), s.store_name " - + "ORDER BY amount DESC " - + "LIMIT #{limit}") + @Select(""" + SELECT COALESCE(NULLIF(t.store_no, ''), '') AS dimKey, + s.store_name AS dimName, + COALESCE(SUM(t.posted_amount), 0)::bigint AS amount, + COUNT(*)::bigint AS orders + FROM pay_trade t + LEFT JOIN mch_store_info s + ON s.store_no = t.store_no AND s.mch_no = t.mch_no AND s.deleted = false + WHERE t.status = 'success' AND t.posted_amount > 0 + AND t.pay_time >= #{start} AND t.pay_time < #{end} + AND t.mch_no = #{mchNo} + GROUP BY COALESCE(NULLIF(t.store_no, ''), ''), s.store_name + ORDER BY amount DESC + LIMIT #{limit} + """) List dimRankByStore( @Param("start") OffsetDateTime start, @Param("end") OffsetDateTime end,