2016-04-13 14 views
1

どの月に最も多くのエントリがあるかを特定する必要があります。 IVEはTO_DATE関数を使用して日付列をMONTHにフォーマットしました。また、SELECT COUNT(*)をGROUP BY句と組み合わせて使用​​すると、すべてのレコードの月とカウントの属性を返すことができます。SQLPLUS(Oracle) - GROUPBYの最大数を取得

しかし、私はCOUNTのMAXである1つの行だけを返すことができる必要があります。 IVEはHAVING節を追加することを試みましたが、エラーを返します。私はどこかでここにサブクエリが必要だと思うが、それについてどうやって行くのか分からない。

SELECT TO_CHAR(P.DATEREGISTERED,'MONTH') MONTH, COUNT(*) COUNT 
FROM PET P 
GROUP BY TO_CHAR(P.DATEREGISTERED,'MONTH') 
HAVING COUNT = MAX(COUNT); 

別の試み:

SELECT TO_CHAR(P.DATEREGISTERED,'MONTH') MONTH, COUNT(*) COUNT 
FROM PET P 
GROUP BY TO_CHAR(P.DATEREGISTERED,'MONTH') 
HAVING COUNT(*) = (SELECT MAX(TO_CHAR(P.DATEREGISTERED,'MONTH')) FROM PET P); 

答えて

2

、あなたは月によってグループ化したレコードの数のカウントを取得し、あなたはその回数が月の文字列に変換「日付値」の最大のと同じであるかどうかをチェックされています。彼らは同じ種類の比較でさえありません。

回答で指定したクエリは、両側のカウントを正しく比較します。問合せをリライトする

もう一つの方法は、

select * from 
(SELECT TO_CHAR(P.DATEREGISTERED,'MONTH') MONTH, COUNT(*) COUNT 
FROM PET P 
GROUP BY TO_CHAR(P.DATEREGISTERED,'MONTH') order by count(*) desc) 
where rownum=1 

だろうここでは、数の多い順、その後、そこから最初の行を取得することにより、サブクエリ内のレコードを注文します。

0

怒鳴るコードが動作し、正しい応答を返します。それがなぜ機能するのかわかりませんが、上記の試み(別名付き)はそうではありません。別名を持つクエリで

SELECT TO_CHAR(P.DATEREGISTERED,'MONTH') MONTH, COUNT(*) COUNT 
FROM PET P 
GROUP BY TO_CHAR(P.DATEREGISTERED,'MONTH') 
HAVING COUNT(*) = (SELECT MAX(COUNT(*)) FROM PET P GROUP BY TO_CHAR(P.DATEREGISTERED,'MONTH')); 
+0

いいえ、毎月のカウント数が異なる場合にのみ動作します。 OTOHの場合、cableloadによる答えは常に1行しか返されず、1つのテーブル参照だけがはるかに効率的でなければなりません。 – symcbean

関連する問題