SQL检索包含相同第一个单词的值的数量?

时间:2014-10-20 05:03:55

标签: sql oracle

我需要编写一个SQL查询来计算有多少电影标题与数据库中的20个或更多其他电影具有相同的第一个字。

例如,如果23部电影在标题中包含第一个单词“SHREK”,26部电影在标题中包含“PUPPY”字样,则输出应如下所示:

First_Word ________ Count

   SHREK          23 
   PUPPY          26

2 个答案:

答案 0 :(得分:1)

SELECT SUBSTR(FILM_TITLE, 1, INSTR(FILM_TITLE, ' ', 1) - 1),
       COUNT(*)
  FROM FILM_TABLE
 GROUP BY SUBSTR(FILM_TITLE, 1, INSTR(FILM_TITLE, ' ', 1) - 1)
HAVING COUNT(*) >= 20;

答案 1 :(得分:1)

使用REGEXP_SUBSTR

WITH DATA AS(
SELECT 'SHREK THE MOVIE' str FROM dual UNION ALL
SELECT 'PUPPY THE MOVIE' FROM dual UNION ALL
SELECT 'SHREK THE MOVIE' FROM dual UNION ALL
SELECT 'PUPPY THE MOVIE' FROM dual UNION ALL
SELECT 'SHREK THE MOVIE' FROM dual
)
SELECT regexp_substr(str, '\w+') sub_str, count(*) sub_str
FROM DATA
GROUP BY regexp_substr(str, '\w+')
/

SUB_STR            SUB_STR
--------------- ----------
SHREK                    3
PUPPY                    2

SQL>

使用SUBSTR + INSTR

WITH DATA AS(
SELECT 'SHREK THE MOVIE' str FROM dual UNION ALL
SELECT 'PUPPY THE MOVIE' FROM dual UNION ALL
SELECT 'SHREK THE MOVIE' FROM dual UNION ALL
SELECT 'PUPPY THE MOVIE' FROM dual UNION ALL
SELECT 'SHREK THE MOVIE' FROM dual
)
SELECT SUBSTR(str, 1, INSTR(str, ' ', 1) - 1) sub_str, count(*)
FROM DATA
GROUP BY SUBSTR(str, 1, INSTR(str, ' ', 1) - 1)
/

SUB_STR           COUNT(*)
--------------- ----------
SHREK                    3
PUPPY                    2

SQL>

<强>更新

对于单字电影名称,上述SUBTR + INSTR方法将失败。需要使用CASE构造来修复它。

SQL> WITH DATA AS(
  2  SELECT 'SHREK' str FROM dual UNION ALL
  3  SELECT 'PUPPY THE MOVIE' FROM dual UNION ALL
  4  SELECT 'SHREK THE MOVIE' FROM dual UNION ALL
  5  SELECT 'PUPPY THE MOVIE' FROM dual UNION ALL
  6  SELECT 'SHREK THE MOVIE' FROM dual
  7  )
  8  SELECT
  9    CASE
 10      WHEN INSTR(str, ' ', 1) = 0
 11      THEN str
 12      ELSE SUBSTR(str, 1, INSTR(str, ' ', 1) - 1)
 13    END sub_str,
 14    COUNT(*)
 15  FROM DATA
 16  GROUP BY
 17    CASE
 18      WHEN INSTR(str, ' ', 1) = 0
 19      THEN str
 20      ELSE SUBSTR(str, 1, INSTR(str, ' ', 1) - 1)
 21    END
 22  /

SUB_STR           COUNT(*)
--------------- ----------
SHREK                    3
PUPPY                    2

SQL>