【问题标题】:SQL making column with % of totalSQL制作列占总数的百分比
【发布时间】:2023-02-18 19:24:50
【问题描述】:

我正在制作一张包含其他银行交易金额的表格。 第一行将是总数。第一列是绝对数字,第二列是总金额的百分比,第三列是最后一列,是发件人银行的名称。

例如:

TRN % BANK
8000 100% ALL
4000 50% BANK1
2000 25% BANK2
2000 25% BANK3

我无法获取 % 列,因为在我的脚本中数据已经分组。

SELECT COUNT(*)
      ,'100%' as %,
      ,'ALL' as BANK
FROM table A

UNION ALL 

SELECT COUNT(*) 
      ,**IDK**
      ,BANK_ID BANK
FROM TABLE2 B
GROUP BY A.BANK_ID
ORDER BY 1 DESC 

我知道应该有过度分区的可能性,但我不知道如何。

感谢您的任何提示!

【问题讨论】:

  • 你能用样本输入表更新你的帖子吗?
  • 你的意思是源表?
  • 当您应用固定查询时,您的输出将是所呈现的预期输出的表。

标签: sql oracle plsql plsqldeveloper


【解决方案1】:

嗨,我认为这应该可以解决问题。

您可以使用 over 分区并在括号中指定任何内容。

SELECT COUNT(*)
      ,'100%' as '%',
      ,'ALL' as BANK

UNION ALL 

SELECT COUNT(*) 
      ,cast(count(*)*100/count(*) over () as varchar) +'%'
      ,BANK_ID BANK
FROM TABLE2 B
GROUP BY B.BANK_ID
ORDER BY 1 DESC 

【讨论】:

  • 此代码将因应用 UNION ALL 的表之间的类型不匹配而引发错误,而且还因为在第二个查询中,您正在聚合未提及表中的字段(范围内不存在 A.BANK_ID SELECT ... FROM TABLE2 B)
  • 试过那个,但它导致乘法而不是其他任何东西。
  • 啊,抱歉,我是在 MS SQL 中做的,可能需要对 PLSQL 的括号/语法进行一些更改
【解决方案2】:

我不太熟悉 Oracle 语法,所以下面可能需要一些调整,但它应该足够可移植。这是在 MS SQL 中。很抱歉无法以您需要的直接语法为您提供解决方案。如果有人更熟悉,请随时编辑。

DECLARE @totalCount BIGINT = (SELECT Count(*) FROM table);
SELECT 
    @TotalCount AS [Count],
    FORMAT(1, 'P') AS [%],
    'ALL' AS [BANK]
--removed table here as the only derived value is the count and we already have it in @totalCount

UNION ALL

SELECT 
    COUNT(*) AS [Count], 
    FORMAT(CAST(Count(*) AS DECIMAL) / @TotalCount,'P') AS [%],
    BANK_ID AS [BANK]
FROM [tableName]
GROUP BY [tableName].BANK_ID
--ORDER BY 1

【讨论】:

    【解决方案3】:

    我得到了这个解决方案,谢天谢地,它有效,

    with alll as
    (
    SELECT
    COUNT(*) trn
    
    ,'100%' AS prcnt
    ,'ALL' AS BANK_ID
    
    FROM table
    
    )
    , bank as 
    (
    SELECT distinct
    
    
    count(1) over (partition by BANK_ID) cnt_B
    ,to_char(round(count(1) over (partition by BANK_ID)/count(*) over (partition by 1),3)*100) || '%' as prcnt
    ,BANK_ID
    
    FROM table
    )
    
    
    
    select * from alll
    
    UNION ALL 
    
    select * from bank
    
    

    【讨论】:

      【解决方案4】:

      样本数据:

      create table demo (trn number, bank varchar2(10));
      
      insert all
          into demo values (1000, 'BANK1')
          into demo values (1000, 'BANK1')
          into demo values (1000, 'BANK1')
          into demo values (1000, 'BANK1')
          into demo values (1000, 'BANK2')
          into demo values (1000, 'BANK2')
          into demo values (1000, 'BANK3')
          into demo values (1000, 'BANK3')
      select * from dual;
      

      询问:

      select sum(trn)
           , case grouping(bank)
                 when 1 then 100
                 else 100 * ratio_to_report(sum(trn)) over ()
             end as percent
      from   demo
      group by rollup (bank);
      
        SUM(TRN)    PERCENT
      ---------- ----------
            4000         25
            2000       12.5
            2000       12.5
            8000        100
      

      ratio_to_report() 返回一个介于 0 和 1 之间的值,所以我乘以 100 将其表示为百分比。

      case 表达式在生成的总计行中将百分比硬编码为 100 有点麻烦,否则 ratio_to_report() 包括 8000 总数并将其报告为 50%。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2019-11-27
        • 2020-03-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2018-09-02
        相关资源
        最近更新 更多