2016-05-11 3 views
0

Ich versuche alle Angestellten zu erfassen, die geplant waren, nur auf sat/sun zu erscheinen, aber tatsächlich an anderen Tagen außer sat/sun aufgetaucht sind. Ich versuche, diese Anzahl durch contractor_firm zu gruppieren, aber ich bekomme einen Fehler in meinem Fall, dass Fensterfunktionen nicht erlaubt sind.Gruppe in der case-Anweisung

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

Warum das 'OVER'? – dnoeth

+0

ohne den over wird es mir nicht nur eine Gesamtanzahl geben. Ich muss es nach Auftragnehmer gruppieren? – Kiran

+0

Nun, du schreibst * versuchst, diese Anzahl mit contractor_firm * zu gruppieren, dies wird in 'GROUP BY contractor' übersetzt. – dnoeth

Antwort

0

Der Teil vor OVER muss ein Aggregat sein, was nicht der Fall in der Abfrage ist (Sie den gesamten Ausdruck kumulieren). Das ist also ungültige SQL.

Vielleicht wollte man so etwas tun:

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

Könntest du etwas Feedback zu den gegebenen Antworten geben? – trincot

0

das, was Sie Was tun?

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 

Wenn Sie wollen, dass die Anzahl der Mitarbeiter statt Vorfälle, dann verwenden 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

Es gibt wahrscheinlich viele bessere Möglichkeiten, dies zu erreichen, aber hier ist eine, die sein sollte Nähe zu arbeiten, ohne Ihre genaue Tabellenstruktur zu kennen:

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 

Dies wird COUNT() nur die emp_ids, die für die Arbeit an entweder "Sat" oder "Sun" geplant waren, keine Wochentage, dann endete an einem der Wochentage. Ich betone entweder hier, weil sie nicht notwendigerweise sowohl auf 'Sat' als auch auf 'Sun' geplant sein müssen - ich glaube, das entspricht Ihren Anforderungen.

Verwandte Themen