refactor(dashboard): 报表 Mapper @Select 改为 text block

利用 Java text block 提升多行 SQL 可读性,语义与占位符不变。

Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
DaxPay Dev
2026-07-23 11:10:58 +08:00
parent 00ca747134
commit 32fc52dd0a
2 changed files with 228 additions and 184 deletions

View File

@@ -32,126 +32,146 @@ public interface AdminTradeReportMapper extends MPJBaseMapper<PayTrade> {
// ===== 概览 =====
/// 成交聚合: 按 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<TradeTrendItemResult> 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<RefundTrendItemResult> 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<ProviderDistItemResult> 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<ProviderSuccessItemResult> 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<HourlyDistItemResult> 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<AmountRangeItemResult> 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<MerchantRankItemResult> merchantRank(
@Param("start") OffsetDateTime start,
@Param("end") OffsetDateTime end,

View File

@@ -32,34 +32,40 @@ public interface MchTradeReportMapper extends MPJBaseMapper<PayTrade> {
// ===== 概览 =====
/// 成交聚合: 按 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<PayTrade> {
// ===== 趋势 =====
@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<TradeTrendItemResult> 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<RefundTrendItemResult> refundTrend(
@Param("start") OffsetDateTime start,
@Param("end") OffsetDateTime end,
@@ -95,30 +105,34 @@ public interface MchTradeReportMapper extends MPJBaseMapper<PayTrade> {
// ===== 渠道分布 =====
@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<ProviderDistItemResult> 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<ProviderSuccessItemResult> providerSuccess(
@Param("start") OffsetDateTime start,
@Param("end") OffsetDateTime end,
@@ -126,14 +140,16 @@ public interface MchTradeReportMapper extends MPJBaseMapper<PayTrade> {
// ===== 时段分布 =====
@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<HourlyDistItemResult> hourlyDist(
@Param("start") OffsetDateTime start,
@Param("end") OffsetDateTime end,
@@ -141,18 +157,20 @@ public interface MchTradeReportMapper extends MPJBaseMapper<PayTrade> {
// ===== 金额区间分桶 =====
@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<AmountRangeItemResult> amountRange(
@Param("start") OffsetDateTime start,
@Param("end") OffsetDateTime end,
@@ -161,20 +179,22 @@ public interface MchTradeReportMapper extends MPJBaseMapper<PayTrade> {
// ===== 维度排名 =====
/// 按通道商户号分组排名
@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<DimRankItemResult> dimRankByChannelMch(
@Param("start") OffsetDateTime start,
@Param("end") OffsetDateTime end,
@@ -182,20 +202,22 @@ public interface MchTradeReportMapper extends MPJBaseMapper<PayTrade> {
@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<DimRankItemResult> dimRankByApp(
@Param("start") OffsetDateTime start,
@Param("end") OffsetDateTime end,
@@ -203,19 +225,21 @@ public interface MchTradeReportMapper extends MPJBaseMapper<PayTrade> {
@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<DimRankItemResult> dimRankByStore(
@Param("start") OffsetDateTime start,
@Param("end") OffsetDateTime end,