Ich habe einen Tisch, der so aussieht

jjsc_job_no jjsc_from_status jjsc_time           jjsc_wf_userid
123456      D                2012-07-01 13:33:27 804
123456      E                2014-04-08 03:22:35 804
123457      D                2012-07-01 13:33:27 805
123457      E                2014-04-08 03:22:35 806

Ich möchte ein Ergebnis, bei dem jjsc_from_status = 'E' überprüft wird, ob derselbe Job bei jjsc_from_status = 'D' ein anderes jjsc_wf_userid hatte. Wenn ja, geben Sie 3 zurück, wenn nicht 0

Ich habe so etwas geschrieben, sage aber Syntaxfehler

select case jjsc_from_status 
                    when 'E' then if(select jjsc_from_status from jdwf_job_status_cycle where jjsc_wf_userid = jjsc_wf_userid, 0,3 )
                    when 'D' then 9                     
                    end as estimatedunits
                    from jdwf_job_status_cycle 
                    where jjsc_time>='$fDate' and jjsc_time<='$tDate'
                    order by jjsc_time

Erwartetes Ergebnis ist

estimatedunits
9
0
9
3
0
Red Bottle 3 Juli 2019 im 11:25

3 Antworten

Beste Antwort

Sie können dies mit einem verschachtelten CASE und EXISTS tun:

select 
  case j.jjsc_from_status 
    when 'D' then 9
    when 'E' then 
      case 
        when exists (
          select 1 from jdwf_job_status_cycle 
          where jjsc_job_no = j.jjsc_job_no and jjsc_from_status = 'D' 
          and jjsc_wf_userid <> j.jjsc_wf_userid)
        then 3 
        else 0 
      end 
  end as estimatedunits
from jdwf_job_status_cycle j 
where jjsc_time>='$fDate' and jjsc_time<='$tDate'
order by jjsc_time

Siehe die Demo (ohne die WHERE-Klausel).
Ergebnisse:

| estimatedunits |
| -------------- |
| 9              |
| 0              |
| 9              |
| 3              |
1
forpas 3 Juli 2019 im 09:05

Sie sollten IMMER einen Alias für Ihre Tabellen verwenden!

In diesem Fall möchten Sie Daten aus der Laufwerkstabelle in der Unterabfrage verwenden. Geben Sie daher zwei verschiedene Aliasnamen ein:

select 
    case jsc.jjsc_from_status 
        when 'E' then if(exists(select jjsc_from_status from jdwf_job_status_cycle jsc2 where jsc2.jjsc_job_no = jsc.jjsc_job_no and jsc2.jjsc_from_status = 'D' and jsc2.jjsc_wf_userid <> jsc.jjsc_wf_userid), 3, 0)
        when 'D' then 9
    end as estimatedunits
from jdwf_job_status_cycle jsc
where jsc.jjsc_time>='$fDate' and jsc.jjsc_time<='$tDate'
order by jsc.jjsc_time
1
lakta 3 Juli 2019 im 08:56

Die Ursache für Syntaxfehler ist das Platzieren von select, das eine Zeichenfolge in die if -Klausel zurückgibt. Sie sollten die Abfrage in der if -Klausel ändern, um ein boolesches Ergebnis zurückzugeben, etwa:

select case jjsc_from_status 
                    when 'E' then if( (select count(jjsc_from_status) from jdwf_job_status_cycle as t2 where t1.jjsc_wf_userid = t2.jjsc_wf_userid) > 0, 0,3 )
                    when 'D' then 9                     
                    end as estimatedunits
                    from jdwf_job_status_cycle as t1
                    where jjsc_time>='$fDate' and jjsc_time<='$tDate'
                    order by jjsc_time
0
Zeid Al-Rashwani 3 Juli 2019 im 09:10