2011-12-06 46 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