如何在Oracle SQL中使用UNION运算符进行排序,我使用了两个选择语句和UNION运算符,我希望对两个查询的结果进行排序

b5buobof  于 2022-11-22  发布在  Oracle
关注(0)|答案(2)|浏览(283)

我正在尝试解决HackerRank SQL -PADS问题。
问题是:
生成以下两个结果集:
1.查询职业中所有姓名的 * 字母顺序 * 列表,紧跟每个职业的第一个字母作为括号(即:括在括号中)。例如:AnActorName(A)ADoctorName(D)AProfessorName(P)ASingerName(S)中的一个或多个。
1.查询OCCUPATIONS中每个职业的出现次数。按 * 升序 * 对出现次数进行排序,并按以下格式输出它们:

There are a total of [occupation_count] [occupation]s.

其中[occupation_count]OCCUPATIONS中某个职业出现的次数,[occupation]是 * 小写 * 职业名称。如果多个 Occupation 具有相同的[occupation_count],则应按字母顺序对其进行排序。
我的解决方案是:

SELECT NAME || '(' || SUBSTR(OCCUPATION,1,1) || ')' 
FROM OCCUPATIONS
ORDER BY NAME 
UNION  
SELECT 'There are a total of ' || COUNT(OCCUPATION) || ' ' ||  LOWER(OCCUPATION) || 's.' 
FROM OCCUPATIONS 
GROUP BY OCCUPATION 
ORDER BY OCCUPATION;

OP:
ERROR at line 4:
ORA-00933: SQL command not properly ended
(It seems, we cannot use ORDER BY BEFORE UNION)

我将代码修改为:

SELECT NAME || '(' || SUBSTR(OCCUPATION,1,1) || ')' 
FROM OCCUPATIONS 
UNION  
SELECT 'There are a total of ' || COUNT(OCCUPATION) || ' ' ||  LOWER(OCCUPATION) || 's.' 
FROM OCCUPATIONS 
GROUP BY OCCUPATION 
ORDER BY NAME, OCCUPATION;

OP:
ERROR at line 7:
ORA-00904: "NAME": invalid identifier

拜托,帮帮我。

wfauudbj

wfauudbj1#

生成以下两个结果集
您正在NOT生成两个结果集。您正在执行两个SELECT,并试图使用UNION将它们合并为一个结果集,但这不是问题所要求的。请停止使用UNION,并使用两个查询。
第一个结果集为:

SELECT NAME || '(' || SUBSTR(OCCUPATION,1,1) || ')' 
FROM   OCCUPATIONS 
ORDER BY NAME;

第二个结果集为:

SELECT 'There are a total of ' || COUNT(OCCUPATION) || ' ' || LOWER(OCCUPATION) || 's.' 
FROM OCCUPATIONS 
GROUP BY OCCUPATION

然后你需要ORDER BY出现的次数AND然后按职业名称(我留给你来解决)。

0sgqnhkj

0sgqnhkj2#

由于您希望在一个查询中输出两个有序数据集,最简单的方法是为每个查询分配一个标识符,然后按该标识符和要排序的列进行排序,例如:

SELECT info
FROM   (SELECT 1 qry, NAME || '(' || SUBSTR(OCCUPATION,1,1) || ')' info
        FROM   OCCUPATIONS
        UNION ALL
        SELECT 2 qry, 'There are a total of ' || COUNT(OCCUPATION) || ' ' ||  LOWER(OCCUPATION) || 's.' info
        FROM OCCUPATIONS
        GROUP BY OCCUPATION)
ORDER BY qry, info;

请注意,因为两个查询不会返回相同的行,所以我使用了UNION ALL,因为UNION对结果数据集执行DISTINCT,而UNION ALL不执行。另外,我假设如果有两个不同的人具有相同的姓名和职业(例如,不同的出生日期),您应该输出两行,而不是一行。
另请注意,当您使用UNION/UNION ALL查询时,输出列继承了第一个查询的列名,这就是第二个查询出现无效标识符错误(您没有为列指定别名!)的原因。

相关问题