Oracle Apex 22中堆叠柱状图按物理CPU值排序的实现问题
Oracle Apex 22中堆叠柱状图按物理CPU值排序的实现问题
我完全理解你的困扰——Apex 22的多系列堆叠柱状图默认的排序选项确实有点受限,只能按标签或总堆叠值排序,没法直接指定按某个系列(比如你的物理CPU)来排序。不过咱们可以通过两个简单的步骤解决这个问题:
第一步:调整查询的排序逻辑
首先,你需要确保你的SQL查询本身是按照物理CPU(PC列)来排序的,而不是原来的Unused_CPUs。修改查询的ORDER BY子句,直接指定按PC列排序(可以是DESC降序或ASC升序,根据你的需求):
SELECT host AS Host, TO_NUMBER(MAX(CASE WHEN obj = 'OnlineVirtualCPUs' THEN val END)) AS OnlineVirtualCPUs, TO_NUMBER(MAX(CASE WHEN obj = 'pc' THEN val END)) AS PC, MAX(CASE WHEN obj = 'OnlineVirtualCPUs' THEN val ELSE 0 END) - MAX(CASE WHEN obj = 'pc' THEN val ELSE 0 END) AS Unused_CPUs, MAX(TS) AS Timestamp, 'Host: ' || host || '<br> OnlineVirtualCPUs: ' || TO_CHAR(MAX(CASE WHEN obj = 'OnlineVirtualCPUs' THEN val END)) || '<br> Physical CPUs: ' || TO_CHAR(MAX(CASE WHEN obj = 'pc' THEN val END), 'FM0.00') || '<br> Unused CPUs: ' || TO_CHAR(MAX(CASE WHEN obj = 'OnlineVirtualCPUs' THEN val ELSE 0 END) - MAX(CASE WHEN obj = 'pc' THEN val ELSE 0 END), 'FM0.00') || '<br> Time: ' || MAX(TS) AS Tooltip FROM table WHERE (service = 'service1' AND obj = 'OnlineVirtualCPUs') OR (service = 'service2' AND obj = 'pc') AND ts > SYSDATE - 1 GROUP BY host ORDER BY PC DESC; -- 这里改为按物理CPU值降序排序,按需调整为ASC
如果你的PC列可能存在NULL值,建议用NVL函数处理,避免排序异常:
ORDER BY NVL(PC, 0) DESC;
第二步:让图表遵循查询的排序顺序
接下来需要修改图表区域的属性,让Apex不要覆盖查询的排序结果:
- 打开你的堆叠柱状图区域的属性面板
- 找到Multi-Series Chart Data部分
- 将
Sort-Order选项设置为None
这样设置后,图表会直接使用SQL查询返回的行顺序,也就是我们刚才按物理CPU排序后的结果,而不是默认的总堆叠值排序。
验证效果
保存修改后运行页面,你应该就能看到堆叠柱状图按照物理CPU的数值排序了。如果还有问题,可以检查一下查询是否正确返回了按PC排序的结果,或者确认图表的Sort-Order确实设置为了None。
备注:内容来源于stack exchange,提问作者SumoHummel
相关产品推荐
相关产品推荐

