我的查询如下所示。输出
电流输出
Role Cases prepped % Completed
State Member 1 10 5 50%
State Member 2 10 7 70%
State President 10 2 20%
Summary 30 14 46.6%
预期输出
Role Cases prepped % Completed
State President 10 2 20%
State Member 1 10 5 50%
State Member 2 10 7 70%
Summary 30 14 46%
角色表
id name
30 State President
40 State Member
这是我的查询,
SELECT COALESCE(ROLE, 'Summary') ROLE,
count(*) AS cases,
SUM(CASE WHEN PREPARED = 'Y' THEN 1
ELSE 0
END) AS prepped,
round(avg(case when prepared = 'Y' then 100 else 0 end),2)||'%' as % Completed
FROM
(SELECT CASE
WHEN r.id = 30 THEN r.name
ELSE r.name || ' ' || u.case_member_id
END AS ROLE,
bi.prepared
FROM cases c
LEFT JOIN case_inventory ci ON ci.case_id = c.id
AND c.id = ci.case_id
AND c.delete_date IS NULL
AND ci.case_id =40
Left JOIN users u ON ci.assigned_to = u.id
Left JOIN ROLES r ON u.role_id = r.id
Left JOIN user_cases_map uc ON c.id = uc.case_id
AND uc.id = 1572919346)
GROUP BY ROLLUP (ROLE);
我现在想根据角色对行进行排序。第一个记录应该是州主席,然后是州议员 1. 州议员 2. 等等。我尝试在内部子句中添加 order by ,但没有帮助。它没有任何效果。添加外部选择也不会改变任何内容。非常感谢任何帮助。谢谢。
你可以做这样的事情。我没有你的输入数据,所以我用了SCOTT.EMP
反而。
请注意几件事。我分组依据JOB
,我用过GROUPING(JOB)
同时在SELECT
(添加标签TOTAL
对于摘要行)和ORDER BY
。由于我重复使用了列名JOB
in SELECT
(对于输出列),在ORDER BY
我必须小心限定列名JOB
(为了清楚起见,我指的是输入表列,而不是SELECT
- 如果列名在,这将是默认值ORDER BY
不合格)。需要限定列名ORDER BY
,然后,强迫我给表中的表起别名FROM
子句(否则我将不得不在任何地方携带完整的表名)。
使用GROUPING
函数于SELECT
(而不是NVL
) 尤为重要,如果JOB
can be null
。你不想要这个团体null
待标记的工作TOTAL
- 您只需要汇总行。这一点甚至让很多非常高级的程序员感到困惑。
我向您展示如何“手动”决定顺序:PRESIDENT
首先,然后MANAGER
,然后是所有其他作业(按字母顺序排列)。如果您在某处保存了优先级顺序,例如在表中,您可以加入该表并使用排序列而不是“手动”CASE
我的查询中的表达式。
select case grouping(job) when 0 then job else 'TOTAL' end as job
, sum(sal) as total_salary
from scott.emp e
group by rollup(job)
order by grouping(e.job) -- to get the total in the last row
, case e.job when 'PRESIDENT' then 1 when 'MANAGER' then 2 end
, e.job
;
JOB TOTAL_SALARY
--------- ------------
PRESIDENT 5000
MANAGER 8275
ANALYST 6000
CLERK 4150
SALESMAN 5600
TOTAL 29025
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)