我正在嘗試解決 HackerRank SQL - PADS問題。
問題是:
生成以下兩個結果集:
查詢OCCUPATIONS中所有名稱按字母順序排列的串列,緊隨其后的是每個職業的第一個字母作為括號(即:括在括號中)。例如:
AnActorName(A)、ADoctorName(D)、AProfessorName(P)和ASingerName(S)。在 OCCUPATIONS 中查詢每個職業的出現次數。將出現的次數按升序排序,并按以下格式輸出:
There are a total of [occupation_count] [occupation]s.其中
[occupation_count]是職業在 OCCUPATIONS 中出現的次數,是小寫[occupation]的職業名稱。如果多個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
請幫幫我。
uj5u.com熱心網友回復:
生成以下兩個結果集
您沒有生成兩個結果集。您正在執行兩個SELECTs 并嘗試將它們合并到一個結果集中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出現的次數,然后是職業名稱(我留給你解決)。
uj5u.com熱心網友回復:
由于您想在一個查詢中輸出兩組有序的資料,最簡單的方法是為每個查詢分配一個識別符號,然后按該識別符號和您要排序的列進行排序,例如:
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;
請注意,因為這兩個查詢不會回傳相同的行,所以我使用了 a UNION ALL,因為 aUNION對結果資料集執行 DISTINCT,而UNION ALL沒有。另外,我假設如果您有兩個不同的人具有相同的姓名和職業(例如不同的出生日期),您應該輸出兩行,而不是一行?
另請注意,當您有UNION/UNION ALL查詢時,輸出列從第一個查詢繼承列名,這就是為什么您的第二個查詢給您無效識別符號錯誤(您沒有給您的列一個別名!)。
轉載請註明出處,本文鏈接:https://www.uj5u.com/yidong/532689.html
標籤:sql甲骨文
