我在列用户中有用户名,我想将所有用户显示为列,列的表示顺序必须是其数据总和的降序。
查询:
<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
答案 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
如果您确实需要在标题中放置用户名,则必须使用动态SQL或外部代码编写代码技术。
我不知道您是否真的有table
或schema
之类的列,它们都是保留字,而且一旦您写了tran_count
并且标题为count_date
时,我有些困惑。但是您可以在链接的dbfiddle工作示例中看到带有列schema_, table_, users, tran_count
的示例。