2016-05-11 5 views
0

私はsat/sunでのみ表示されるようにスケジュールされていたが、実際にはsat/sun以外の他の日に表示されたすべての従業員を数えようとしています。 私はcontractor_firmでこのカウントをグループ化しようとしていますが、私のケースではウィンドウ関数が許可されていないというエラーが表示されます。ケース内のグループステートメント

count(case 
      when 
      TO_CHAR(emp_expected_date , 'DY', 'NLS_DATE_LANGUAGE=ENGLISH') IN ('SAT', 'SUN') 
      and TO_CHAR(emp_actual_date , 'DY', 'NLS_DATE_LANGUAGE=ENGLISH') 
      NOT IN ('SAT', 'SUN') THEN emp_id OVER (PARTITION BY contractor) ELSE NULL end) 
      AS contractor_non_compliance 
+1

なぜ「オーバー」ですか? – dnoeth

+0

がなければ、それは私に全体的なカウントを与えるだけではありません。請負業者でグループ分けする必要がありますか? – Kiran

+0

さて、あなたはcontractor_firm *でこの数をグループ化しようとしましたが、これは 'GROUP BY contractor'に翻訳されます – dnoeth

答えて

0

OVERの前の部分は、あなたのクエリ内の場合(あなたが式全体を集計している)ではない集計、でなければなりません。これは無効なSQLです。

はたぶん、あなたはこのような何かをやってみたかった:

count(case when ... then 1 end) OVER (PARTITION BY contractor) 
+0

答えにいくつかフィードバックを教えてください。 – trincot

0

これは、あなたがやりたいのか?

sum(case when TO_CHAR(emp_expected_date , 'DY', 'NLS_DATE_LANGUAGE=ENGLISH') IN ('SAT', 'SUN') and 
       TO_CHAR(emp_actual_date , 'DY', 'NLS_DATE_LANGUAGE=ENGLISH') NOT IN ('SAT', 'SUN') 
     then 1 else 0 
    end) as contractor_non_compliance 

あなたがcount(distinct)を使用し、従業員ではなく、事件の数が必要な場合:

count(distinct case when TO_CHAR(emp_expected_date , 'DY', 'NLS_DATE_LANGUAGE=ENGLISH') IN ('SAT', 'SUN') and 
         TO_CHAR(emp_actual_date , 'DY', 'NLS_DATE_LANGUAGE=ENGLISH') NOT IN ('SAT', 'SUN') 
        then emp_id 
     end) as contractor_non_compliance 
0

あり、これを達成するためのより良い方法の多くがそうであるが、ここでする必要があります一つです

SELECT count(emp_id), contractor_firm 
FROM your_table 
WHERE emp_id in (
    SELECT emp_id 
    FROM your_table 
    WHERE TO_CHAR(emp_expected_date,'DY','NLS_DATE_LANGUAGE=ENGLISH') in ('SAT','SUN') 
    AND TO_CHAR(emp_expected_date,'DY','NLS_DATE_LANGUAGE=ENGLISH') not in ('MON','TUES','WEDS','THURS','FRI') 
    AND TO_CHAR(emp_actual_date,'DY','NLS_DATE_LANGUAGE=ENGLISH') in ('MON','TUES','WEDS','THURS','FRI') 
) 
GROUP BY contractor_firm 

この意志COUNT()のみ:あなたの正確なテーブル構造を知らなくても、作業に近いです「土曜日」または「日曜日」のいずれかで動作するようにスケジュールされていたが、平日ではなく、平日のいずれかで作業を終了した。 のどちらかがであることを強調しています。なぜなら、必ずしも '土'と '日'の両方でスケジュールする必要はないからです。

関連する問題