1

毎月のレコード数を取得しようとしています。ただし、数か月はレコードがないため、行は返されません。その月のカウントを0にするにはどうすればよいですか?

select months, count(rowid) as counter from (
    select  to_char(date_entered, 'MM') as months
    from mydatatable
    where to_char(date_entered, 'yyyy') = '2011'
     )
group by months
order by months

結果:

Month    Count
01       32
03       12
04       11
06       10
07       222
08       32

subqで遊んでみても、うまくいきselect 1,2,3,4,5,6,7,8,9,10,11,12 from dualませんでした。ピボット機能はまだありません...;(

4

4 に答える 4

2

01から12をテーブルに格納する方がおそらく良いでしょうが、一般的なアプローチは左結合を使用することです。

Select
  m.Mo,
  Count(t.dateentered)
From (
    Select '01' As Mo From Dual Union All
    Select '02' From Dual Union All
    Select '03' From Dual Union All
    Select '04' From Dual Union All
    Select '05' From Dual Union All
    Select '06' From Dual Union All
    Select '07' From Dual Union All
    Select '08' From Dual Union All
    Select '09' From Dual Union All
    Select '10' From Dual Union All
    Select '11' From Dual Union All
    Select '12' From Dual
  ) m
    Left Outer Join
  mydatatable t
    On
      m.Mo = to_char(t.dateentered, 'MM') And 
      t.dateentered >= DATE'2011-01-01' And
      t.dateentered < DATE'2012-01-01'
Group By
  m.Mo
Order By
  m.Mo

Updateは、年を制限するためのよりインデックスに適した方法を使用しました。

http://sqlfiddle.com/#!4/68085/10

于 2013-01-18T17:52:43.223 に答える
1

独自の12行の月の「テーブル」を作成し、左外部結合を実行する必要があります。質問からクエリを取得し、データを提供するためのインラインビューにします。

SELECT m.month "Month", nvl(md.data, 0) "Count"
FROM
(
   select '01' month from dual union all
   select '02' month from dual union all
   select '03' month from dual union all
   select '04' month from dual union all
   select '05' month from dual union all
   select '06' month from dual union all
   select '07' month from dual union all
   select '08' month from dual union all
   select '09' month from dual union all
   select '10' month from dual union all
   select '11' month from dual union all
   select '12' month from dual
) m LEFT OUTER JOIN (
   /* Your Query Here */
) md ON m.month = md.month
ORDER BY m.month;

結果は次のようになります。

Month       Count
------ ----------
01             32
02              0
03             12
04             11
05              0
06             10
07            222
08             32
09              0
10              0
11              0
12              0
于 2013-01-18T17:41:07.427 に答える
0

connect by階層クエリの構文を使用して月番号を含むダミーテーブルを作成し、データに左結合することができます。

with months as (
    select to_char(level, 'FM00') as month
    from dual
    connect by level <= 12
)
select m.month,
    count(mdt.rowid) as counter
from months m
left join mydatatable mdt
    on mdt.date_entered >= to_date('01/' || m.month || '/2011', 'DD/MM/YYYY')
    and mdt.date_entered <
        add_months(to_date('01/' || m.month || '/2011', 'DD/MM/YYYY'), 1)
group by m.month
order by m.month;

いくつかの構成されたデータを使用して:

create table mydatatable (date_entered date, dummy number);
insert into mydatatable values (date '2011-06-02', 0);
insert into mydatatable values (date '2011-07-01', 0);
insert into mydatatable values (date '2011-10-01', 0);
insert into mydatatable values (date '2011-10-31', 0);
insert into mydatatable values (date '2011-11-01', 0);

... これは与える:

MONTH COUNTER
----- -------
01          0 
02          0 
03          0 
04          0 
05          0 
06          1 
07          1 
08          0 
09          0 
10          2 
11          1 
12          0 

または、SQL Fiddleは、最近やるべきことのようです...


to_char(date_entered, 'yyyy') = '2011'テーブルのすべての行に関数を適用しているため、一般的には避ける方がよいでしょう。to_char()その列にインデックスがある場合、そのインデックスは使用されません。代わりに、のような列のデータ型に一致するようにフィルターを変換してみてくださいdate_entered > date '2011-01-01' and date_entered < date '2012-01-01'。この場合、とにかく結合条件で処理できます。2011年に毎月を日付範囲に変換し、その月の範囲内で一致するレコードのみを検索します。

于 2013-01-18T17:45:15.653 に答える
0

これは非常に奇妙です...多分私は質問やデータを誤解しました...?質問にテーブルとデータを追加することは常に良い考えです。カウントを使用して、すべての月のすべてのデータを取得する必要があります。私はこれを試しました:

SELECT * FROM stack_test
/
CURR_MONTH  VAL
---------------
01          10
02          15
03          20
04  
05  

ご覧のとおり、4か月目と5か月目には値がありません。

 SELECT months, COUNT(rowid) counter 
   FROM
    (
     SELECT curr_month months
       FROM stack_test
    )
 GROUP BY months
 ORDER BY months
 /
 MONTHS COUNTER
 -------------------
 01           1
 02           1
 03           1
 04           1
 05           1

そして別の例:2か月目は価値がありませんが、もちろんカウントされます。多分あなたはあなたの価値観を合計する必要があります...:

SELECT mth, SUM(val) total_sum, Count(*) total_cnt 
  FROM 
  (
  SELECT mth, (CASE WHEN Mth = '01' THEN '10' ELSE '0' END) val
    FROM
    ( -- Annual table - replace 2 with 12 in Add_Months for the whole year -- 
     SELECT Trunc(SYSDATE,'Y')+Level-1 Curr_Year_By_Date
        , To_char(Trunc(SYSDATE, 'MM') + Rownum-1, 'MM' ) Mth
     FROM dual
    CONNECT BY Level <= Add_Months(Trunc(SYSDATE,'Y'),2)-Trunc(SYSDATE,'Y')
   )
  )
 GROUP BY mth
 ORDER BY 1
 /
 MTH    TOTAL_SUM   TOTAL_CNT
 -------------------------------------
 01         310         31
 02         0           28
于 2013-01-18T19:21:59.050 に答える