根据条件内的每个值的max(count_date)对PIVOT内的列进行排序

时间:2019-07-10 14:53:47

标签: oracle

我在列用户中有用户名,我想将所有用户显示为列,列的表示顺序必须是其数据总和的降序。

查询:

<img class="brand-logo" data-src="img/src/here">

ans:

select * 
from (
  select sum(tran_count) over (partition by schema) as table_name 
  from main_table
) pivot (sum(tran_count) for users in ('abc','lmn','pqr'));

所以我想按其数据计数顺序表示列abc,lmn和pqr:

必填:

schema   table   abc   lmn  pqr
pm       sector   32  216  12
history  trn     321   61   4
tap      issuer   43  325   2
count:           396 602 18

1 个答案:

答案 0 :(得分:0)

您不能在数据透视表的in子句中使用(子)查询。您可以根据用户的摘要值对他们进行排名,并使用in中的这三个值(1、2、3)。然后要么使用我的内部查询(在单独的列中显示用户名和总和),要么进行最后的并集,其中名称在第一行中列出,而总和在下面的行中作为字符串。

with t as (
    select * 
      from (
        select dense_rank() over (order by smu desc, users) rn, 
               schema_, table_, users, smt
          from (
            select schema_, table_, users, sum(tran_count) smt, 
                   sum(sum(tran_count)) over (partition by users) smu
              from main_table
              group by schema_, table_, users))
      pivot (max(users) name, max(smt) smt for rn in (1 u1, 2 u2, 3 u3)))
select null schema_, null table_, u1_name u1, u2_name u2, u3_name u3 
  from t where rownum = 1 union all
select schema_, table_, to_char(u1_smt), to_char(u2_smt), to_char(u3_smt) 
  from t

dbfiddle demo

如果您确实需要在标题中放置用户名,则必须使用动态SQL或外部代码编写代码技术。

我不知道您是否真的有tableschema之类的列,它们都是保留字,而且一旦您写了tran_count并且标题为count_date时,我有些困惑。但是您可以在链接的dbfiddle工作示例中看到带有列schema_, table_, users, tran_count的示例。