我正在尝试解决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
拜托,帮帮我。
2条答案
按热度按时间wfauudbj1#
生成以下两个结果集
您正在NOT生成两个结果集。您正在执行两个
SELECT
,并试图使用UNION
将它们合并为一个结果集,但这不是问题所要求的。请停止使用UNION
,并使用两个查询。第一个结果集为:
第二个结果集为:
然后你需要
ORDER BY
出现的次数AND然后按职业名称(我留给你来解决)。0sgqnhkj2#
由于您希望在一个查询中输出两个有序数据集,最简单的方法是为每个查询分配一个标识符,然后按该标识符和要排序的列进行排序,例如:
请注意,因为两个查询不会返回相同的行,所以我使用了
UNION ALL
,因为UNION
对结果数据集执行DISTINCT,而UNION ALL
不执行。另外,我假设如果有两个不同的人具有相同的姓名和职业(例如,不同的出生日期),您应该输出两行,而不是一行。另请注意,当您使用
UNION
/UNION ALL
查询时,输出列继承了第一个查询的列名,这就是第二个查询出现无效标识符错误(您没有为列指定别名!)的原因。