代码之家  ›  专栏  ›  技术社区  ›  ESchetti

SQL今年的付款比例是卡还是银行

  •  -1
  • ESchetti  · 技术社区  · 2 年前

    我想在特定的日期范围内找到信用卡付款与银行付款的百分比。

    我希望能找到已处理的信用卡付款与银行付款的百分比。我已经过滤了我的列表,以显示在指定日期范围内处理的信用卡付款和银行付款,但我需要计算子查询,以在过滤的表中查找信用卡付款与银行付款的金额。

    我所拥有的是:

    SELECT payment_method, date(created_at), status
    FROM production.payments
    WHERE created_at >= ‘2023-01-01’
       and payment_method != ‘cash’
       and status != ‘failed’
    

    这给了我需要从中提取的数据(今年所有的信用卡付款和银行付款),但现在我需要收集所有信用卡付款的计数和所有银行付款的计数(单独)

    付款_方法 创建时间(_A)
    卡片 2023-01-01
    卡片 2023-01-01
    卡片 2023-01-01
    银行 2023-01-01
    银行 2023-01-01
    卡片 2023-01-02
    银行 2023-01-03
    卡片 2023-01-03
    卡片 2023-01-03
    银行 2023-01-04
    卡片 2023-01-04
    卡片 2023-01-05

    期望输出-今年每种产品的使用次数(然后我可以计算出百分比)

    付款_方法 计数
    卡片 5061
    银行 8632

    期望产出-信用卡付款与银行付款的百分比

    付款_方法 百分率
    卡片 37%
    银行 63%
    2 回复  |  直到 2 年前
        1
  •  0
  •   Eric    2 年前

    我用cte包装你的查询。

    WITH cte AS (
        SELECT payment_method, date(created_at), status
        FROM production.payments
        WHERE created_at >= ‘2023-01-01’
           and payment_method != ‘cash’
           and status != ‘failed’
    )
    SELECT DISTINCT payment_method
    , 100.00 * COUNT(*) OVER(PARTITION BY payment_method) / COUNT(*) OVER() AS [Percentage]
    
        2
  •  0
  •   Isolated    2 年前

    你可以计算每组,然后除以总数。。。。

    create table payments (
      payment_method varchar(10), 
      created_at date
      );
      
    insert into payments values 
    ('card', '2023-01-01'),
    ('card', '2023-01-01'),
    ('card', '2023-01-01'),
    ('card', '2023-01-01'),
    ('card', '2023-01-01'),
    ('card', '2023-01-01'),
    ('card', '2023-01-01'),
    ('bank', '2023-01-01'),
    ('bank', '2023-01-01');
    

    select payment_method, 
     round(count(*) / sum(count(*)) over () * 100 ,2) as pct_of_total
    from payments
    --where your criteria
    group by payment_method;
    
    付款方式 总百分比
    卡片 77.78
    银行 22.22

    View on DB Fiddle