You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

IOMETE环境下YTD交易占比计算及查询合并的SQL实现

IOMETE数据库YTD交易占比计算与UNION操作实现

需求说明

在IOMETE数据库中统计**年初至今(YTD)**的交易数据,按卡类(Card)、银行(Bank)交易类型分别计算:

  • 交易金额占比(Payment Value)
  • 交易笔数占比(Usage)
    同时实现该查询结果与其他已完成数据过滤的查询执行UNION合并。

示例数据

交易编号金额交易类型
Payment110Card
Payment210Card
Payment310Card
Payment410Card
Payment5500Bank

期望结果

交易类型金额占比笔数占比
Card7.41%80.00%
Bank92.59%20.00%

修正后的YTD占比计算SQL

原代码存在CTE命名不匹配、仅统计笔数占比、硬编码年份等问题,以下是优化后的查询:

WITH filtered_payments AS (
    SELECT 
        payment_method AS 交易类型,
        amount AS 金额
    FROM production.payments
    WHERE created_at >= DATE_TRUNC('year', CURRENT_DATE)  -- 动态取当年年初,自动适配YTD
      AND payment_method IN ('Card', 'Bank')  -- 仅保留目标交易类型
      AND status != 'failed'  -- 排除失败交易
)
SELECT 
    交易类型,
    ROUND(SUM(金额) / SUM(SUM(金额)) OVER () * 100, 2) || '%' AS 金额占比,
    ROUND(COUNT(*) / SUM(COUNT(*)) OVER () * 100, 2) || '%' AS 笔数占比
FROM filtered_payments
GROUP BY 交易类型;

关键说明:

  • 用DATE_TRUNC('year', CURRENT_DATE)替代硬编码年份,自动获取当年1月1日,适配每年的YTD统计
  • 同时计算金额、笔数的全局占比,通过窗口函数SUM(...) OVER ()获取总行数/总金额
  • 拼接%符号,直接输出带百分比的结果

与其他查询的UNION操作

执行UNION需满足:两个查询的列数一致、列数据类型匹配,列名以第一个查询为准。

假设已有一个过滤完成的查询other_filtered_data,结构与上述结果一致(交易类型、金额占比、笔数占比),合并写法如下:

-- 第一个查询:YTD占比统计
WITH filtered_payments AS (
    SELECT 
        payment_method AS 交易类型,
        amount AS 金额
    FROM production.payments
    WHERE created_at >= DATE_TRUNC('year', CURRENT_DATE)
      AND payment_method IN ('Card', 'Bank')
      AND status != 'failed'
)
SELECT 
    交易类型,
    ROUND(SUM(金额) / SUM(SUM(金额)) OVER () * 100, 2) || '%' AS 金额占比,
    ROUND(COUNT(*) / SUM(COUNT(*)) OVER () * 100, 2) || '%' AS 笔数占比
FROM filtered_payments
GROUP BY 交易类型

-- 使用UNION ALL保留重复行(性能更优);若需去重则替换为UNION
UNION ALL

-- 第二个查询:已完成过滤的其他数据集
SELECT 
    交易类型,
    金额占比,
    笔数占比
FROM other_filtered_data;

内容的提问来源于stack exchange,提问作者E A S

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.14 17:01:22