SQL问题-为什么我不能解决问题

时间:2019-03-23 09:40:23

标签: sql case-study

为什么我的研究站点上的问题解决方案不被接受并显示“错误答案”?

问题出在这里-https://www.hackerrank.com/challenges/the-pads/problem/

  

生成以下两个结果集:

     
      
  1. 查询OCCUPATIONS中所有名称的按字母顺序排列的列表,紧随其后的是每个专业的第一个字母作为括号(即:括在括号中)。例如:AnActorName(A),ADoctorName(D),AProfessorName(P)和ASingerName(S)。

  2.   
  3. 查询OCCUPATIONS中每个职业的出现次数。按升序对出现的事件进行排序,并以以下格式输出它们:

  4.   
     

共有[occupation_count]个[occupation] s。

     

其中[occupation_count]是OCCUPATIONS中某职业的出现次数,[occupation]是小写职业名称。如果一个以上的职业具有相同的[occupation_count],则应按字母顺序排列。

我的查询是:

SELECT 
    CAST(NAME, CASE 
                  WHEN occupation = 'Actor' THEN '(A)' 
                  WHEN occupation = 'Doctor' THEN '(D)' 
                  WHEN occupation = 'Professor' THEN '(P)' 
                  WHEN occupation = 'Singer' THEN '(S)' 
               END) 
FROM   
    occupations; 

SELECT 
    CASE 
       WHEN occupation = 'Actor' 
          THEN CONCAT('There are a total of ', COUNT(occupation), ' ', LOWER(occupation), 's.') 
       WHEN occupation = 'Doctor' 
          THEN CONCAT('There are a total of ', COUNT(occupation), ' ', LOWER(occupation), 's.') 
       WHEN occupation = 'Singer' 
          THEN CONCAT('There are a total of ', COUNT(occupation), ' ', LOWER(occupation), 's.') 
       WHEN occupation = 'Professor' 
          THEN CONCAT('There are a total of ', COUNT(occupation), ' ', LOWER(occupation), 's.') 
   END 
   FROM
       occupations 
   GROUP BY 
       occupation 
   ORDER BY 
       COUNT(occupation), occupation;  

该查询具有与HackerRank上的示例相同的输出。我在做什么错了?

4 个答案:

答案 0 :(得分:1)

两个问题:

  • 该解决方案应适用于任何职业,而不仅适用于演员,医生,职业或歌手。具有不同职业数据的测试将失败。
  • 第一个结果未按要求排序

第一个查询:

SELECT   CONCAT(Name, '(', substr(Occupation, 1, 1), ')')
FROM     Occupations
ORDER BY Name;

您的第二个查询再次期望一些静态职业,但是当测试数据中的职业不是其中之一时,将返回null。请勿在此处使用CASE

SELECT   CONCAT('There are a total of ', COUNT(Occupation), ' ', LOWER(Occupation), 's.') 
FROM     Occupations
GROUP BY Occupation 
ORDER BY COUNT(Occupation),
         Occupation;  

答案 1 :(得分:1)

说明1:

  1. 在第一部分中,当需要仅将名称和职业一起打印时,我们有一些情况可以检查职业并相应地加上后缀。

  2. 我们使用order by子句根据名称的升序对结果进行排序。

select 
        case 
            when Occupation = "Doctor" then concat(name,"(D)")
            when Occupation = "Actor" then concat(name,"(A)")
            when Occupation = "Professor" then concat(name,"(P)")
            when Occupation = "Singer" then concat(name,"(S)")
            else 'hello'
        end
from Occupations 
order by name;

说明2:

在这种情况下,所有查询所要做的就是将结果与占用进行分组并打印所需的字符串。

select "There are a total of ",count(*) as count1,concat(lower(Occupation),"s.") from Occupations group by Occupation order by count1;

答案 2 :(得分:0)

第一个查询

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

第二个查询

      SELECT 'There are a total of', COUNT(OCCUPATION),
      CASE 
      WHEN  OCCUPATION = 'Doctor' THEN 'doctors.'
      WHEN  OCCUPATION = 'Professor' THEN 'professors.'
      WHEN  OCCUPATION = 'Actor' THEN 'actors.'
      WHEN  OCCUPATION = 'Singer' THEN 'singers.'
      end
      FROM OCCUPATIONS GROUP BY OCCUPATION order by count(OCCUPATION),OCCUPATION;

答案 3 :(得分:0)

以下查询对我有用:

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;