当前位置: 首页 > 知识库问答 >
问题:

Oracle SQL案例

杜阳泽
2023-03-14

我的疑问:

select school, rating, name
from mytable
where school = 'SchoolN';

结果:

+--------+------+-----+
|School  |Rating|Name |
+--------+------+-----+
|SchoolN |  A   |Name1|
|SchoolN |  B   |Name2|
|SchoolN |  A   |Name3|
|SchoolN |  A   |Name4|
|SchoolN |  A   |Name5|
|SchoolN |  B   |Name6|
|SchoolN |  B   |Name7|
|SchoolN |  B   |Name8|
|SchoolN |  B   |Name9|
+--------+------+-----+

我想要的是这样的名字:

+--------+------+---------+
|School  |Rating|Name     |
+--------+------+---------+
|SchoolN |  A   |i-Name1  |
|SchoolN |  B   |i-Name2  |
|SchoolN |  A   |ii-Name3 |
|SchoolN |  A   |iii-Name4|
|SchoolN |  A   |iv-Name5 |
|SchoolN |  B   |ii-Name6 |
|SchoolN |  B   |iii-Name7|
|SchoolN |  B   |iv-Name8 |
|SchoolN |  B   |v-Name9  |
+--------+------+---------+

我试过:

select school, rating,
case when rownum = 1 then 'i-' || name
     when rownum = 2 then 'ii-' || name
     when rownum = 3 then 'iii-' || name
     when rownum = 4 then 'iv-' || name
     when rownum = 5 then 'v-' || name
end Name
from mytable
where school = 'SchoolN';

但结果是错误的:

+--------+------+---------+
|School  |Rating|Name     |
+--------+------+---------+
|SchoolN |  A   |i-Name1  |
|SchoolN |  B   |ii-Name2 |
|SchoolN |  A   |iii-Name3|
|SchoolN |  A   |iv-Name4 |
|SchoolN |  A   |v-Name5  |
|SchoolN |  B   |Name6    |
|SchoolN |  B   |Name7    | 
|SchoolN |  B   |Name8    |
|SchoolN |  B   |Name9    |
+--------+------+---------+

共有3个答案

逄皓轩
2023-03-14

您可以使用中的罗马数字格式说明符RN来指定字符

SELECT
    level as n,
    TO_CHAR(level,'RN') as roman
FROM
    dual
CONNECT BY
    level <= 10;


         N ROMAN          
---------- ---------------
         1               I
         2              II
         3             III
         4              IV
         5               V
         6              VI
         7             VII
         8            VIII
         9              IX
        10               X

10 rows selected. 

因此,在APC的查询中,您可以执行to_char(rn,'RN')||name as name

司空思聪
2023-03-14

ROWNUM只是结果集中的行数。您实际需要的是每个等级name的数目。所以这意味着你需要一个像row_number()这样的分析函数:

with cte as (
    select school, rating, name, 
           row_number() over (partition by  school, rating order by name) as rn       
    from mytable
)
select cte.school, 
       cte.rating,
       case when cte.rn = 1 then 'i-' || name
            when cte.rn = 2 then 'ii-' || name
            when cte.rn = 3 then 'iii-' || name
            when cte.rn = 4 then 'iv-' || name
            when cte.rn = 5 then 'v-' || name
        end Name
from cte
where cte.school = 'SchoolN'
;

这是生成所需结果集所需对代码进行的最小更改。我建议您也加入@KaushikNayak建议,并部署rn格式掩码,因为这将使您的代码更加紧凑,不那么脆弱:

...
select cte.school, 
       cte.rating,
       to_char(cte.rn, 'rn')|| '-' || name as Name
from cte
...

通过小写的格式掩码('rn'),得到小写的输出:iii等。

阎星华
2023-03-14

您可以使用字符转换功能(到字符)的fmRM格式模型选项使用densite\u rank()

select t.school,
       t.rating,
       to_char(dense_rank() over(partition by rating order by name), 'fmrm') 
       || '-' ||t.name name
  from mytable t
 order by t.name;

SQL小提琴演示

 类似资料:
  • 此代码正在触发错误 无效的sql对象。 从文档中我觉得表中的任何对象都是sql对象<这里怎么了? 在Oracle 10G中考虑以下函数 在10G上下文中考虑以下函数 我得到了一个错误的无效对象 我的桌子就像 此表位于“测试”模式中,我与SCOTT有联系,SCOTT有“测试时授予选择权”。测试表到scott's 我还是会出错 ERR_INVALID_OBJECT

  • 我知道这相对简单,但我无法在归档中找到解决方案,尽管我看到了类似的解决方案,但我的SQL不足以对它们进行反向工程。 我所要做的就是从呼叫管理表中,按周分组计算团队中发出的呼叫数。下面是一个返回30000多个条目的代码示例。如果可能的话,我想把这个数字分为几周,也可以根据周五到周五的范围分为几天? 关键领域是 表名称是 这样我就可以创建一个列表,列出该支持组每周记录的通话次数 所以很简单,但是我可以

  • 我有一个大约15万行的表,我必须使用JavaQuartz Scheduler一次获取1000行。要求是一次限制1000行,然后再限制1000行等(与MySQL限制查询相同)。 我正在使用以下查询: 问题是上面的查询返回了我在结果集中不需要的额外列rownum,因为返回的数据被传递给MapListHandler(),后者返回将结果转换为JSON,并且我将此JSON传递给不期望额外rownum列的We

  • 在Crystal Reports中,我使用以下查询(针对Oracle数据库)为报表中的单个字段生成数据: 这可以很好地工作,并基于提供的{HB_As_At_Date}(the{?}语法是Crystal将参数值嵌入SQL(SQL)的方法。不过,上述查询的内容不是我的问题——我想做的是在几个不同的日期重复运行它,并将输出输入Crystal以供在报告中使用。 假设我希望在9月的每个星期一运行这个查询,我

  • Wego DBWeb Godaily - github FXH Blog Gos Gobook

  • Gitea - github.com/go-gitea/gitea Gogs - github.com/gogits/gogs grafana - github.com/grafana/grafana Go语言中文网 - github.com/studygolang/studygolang github.com/m3ng9i/qreader Wego Docker.cn Xorm Adapter

  • Gitea - github.com/go-gitea/gitea Gogs - github.com/gogits/gogs grafana - github.com/grafana/grafana Go语言中文网 - github.com/studygolang/studygolang github.com/m3ng9i/qreader Wego Docker.cn Xorm Adapter

  • 更新日期:2018/8/15 适用软件及版本:mblock V5.0.0-beta.4 1. 用按钮切换小程的表情 1) 拖取一个事件类积木 当按下按钮() 到脚本区,保留默认值。 2) 添加一个播放类积木 播放声音(),选择“开关”。 3) 添加一个显示类积木 显示图案(),保留默认图案。 4) 点击”上传到设备“将程序上传到小程。 5) 按下按钮A看看小程的表情吧! 2. 用小程制作点阵动画