2011-12-06 47 views
1

使用Oracle,我已经选择了的title_id与出版其相关的一个月:与MAX聚合函数甲骨文CASE表达式

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); 

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

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

回答

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列仅在该书发布的月份的第一个月份有午夜日期,则可以删除PUBDATE列中的trunc列。
+0

谢谢你的帮助贾斯汀。当我使用你的陈述时,我发现我没有得到最大数量的书。关于可能发生什么的任何想法? – user1078958

+0

@ user1078958 - 如果您可以发布DDL创建表格,某些DML可以填充一些示例数据,您期望的输出和您获得的输出,这将有所帮助。我们猜测你的表有哪些数据。你能解释你得到的结果,以及它们与你想要的结果有什么不同吗? –

+0

感谢您提供关于DDL和一些DML的建议。这将有助于未来的问题。至于这个例子,我终于能够得到一些有效的东西。非常感谢您的帮助。 :-) – user1078958