具有MAX聚合函数的CASE表达式函数Oracle

时间:2011-12-06 21:45:14

标签: oracle10g aggregate-functions case

使用Oracle,我选择了title_id及其相关的出版月份:

SELECT title_id, 
CASE EXTRACT(month FROM pubdate) 
    WHEN 1 THEN 'Jan'
    WHEN 2 THEN 'Feb'
    WHEN  3 THEN 'Mar'
    WHEN  4 THEN 'Apr'
    WHEN  5 THEN 'May'
    WHEN  6 THEN 'Jun'
    WHEN  7 THEN 'Jul'
    WHEN  8 THEN 'Aug'
    WHEN  9 THEN 'Sep'
    WHEN  10 THEN 'Oct'
    WHEN  11 THEN 'Nov'
    ELSE 'Dec'
    END MONTH 
FROM TITLES;

使用声明:

SELECT MAX(Most_Titles) 
FROM (SELECT count(title_id) Most_Titles, month 
       FROM (SELECT title_id, extract(month FROM pubdate) AS MONTH FROM titles) GROUP BY month);

我能够确定出版图书数量最多的月份。

有没有办法加入这两个语句,以便我可以将月份的文本等效与最大标题数相关联?

1 个答案:

答案 0 :(得分:3)

为了将一个月转换为字符串,我不会使用CASE语句,我只使用TO_CHAR。并且您可以使用分析函数对结果进行排名,以获得出版图书最多的月份。

SELECT num_titles,
       to_char( publication_month, 'Mon' ) month_str
  FROM (SELECT count(title_id) num_titles,
               trunc(pubdate, 'MM') publication_month,
               rank() over (order by count(title_id) desc) rnk
          FROM titles
         GROUP BY trunc(pubdate, 'MM'))
 WHERE rnk = 1

另外几点需要注意

  • 如果有两个月与大多数发布绑定,则此查询将返回两行。如果您希望Oracle任意选择一个,您可以使用row_number分析函数而不是rank
  • 如果表格中的PUBDATE列仅包含发布图书的月份的第一天午夜,则可以删除trunc列上的PUBDATE。< / LI>