0

あいまいな質問のタイトルについてお詫びしますが、正しい表現がわからない場合は、必要に応じて修正してください。

次のMySQLクエリがあり、いくつかのテーブルを結合しています。

select distinct(o.person), 
    o.job,
    p.risk,
    r.training,
    case when c.datecompleted  is null then 'no' else 'yes' end TrainingCompleted,
    case when c.expirydate is null then '' else c.expirydate end expirydate
from 
    orgstructure o 
    join personrisks p on p.Person=o.person
    right outer join risktraining r on r.risk=p.risk
    left outer join coursescompleted c on c.course=r.training and c.person=o.person
where o.department='house keeping' and o.person <> ''
order by o.person desc

以下の結果が得られます。

ここに画像の説明を入力してください

結果として、各リスクには、リスクに対処する2つのトレーニングソリューションがあることがわかります。status各トレーニングとトレーニング完了フィールドを参照する別の列を返したいのですが、いずれかのトレーニングが完了した場合はステータスgood、それ以外の場合はステータスですbad。したがって、この例では、リスクごとに2行しか出力されません。トレーニングが完了していないtraining場合は、必要に応じて価値を示してください。

理想的な出力:

ここに画像の説明を入力してください

このクエリを編集して、目的の結果を得るにはどうすればよいですか。

前もって感謝します。

4

1 に答える 1

0

それを行う最も簡単な方法は

select 
    o.person,
    o.job,
    p.risk,
    case when count(c.datecompleted) > 0 then null else r.training end as training,
    case when count(c.datecompleted) > 0 then 'yes' else 'no' end as TrainingCompleted,
    case when count(c.datecompleted) > 0 then 'good' else 'bad' end as Status
from orgstructure o 
    join personrisks p on p.Person=o.person
    right outer join risktraining r on r.risk=p.risk
    left outer join coursescompleted c on c.course=r.training and c.person=o.person
where o.department='house keeping' and o.person <> ''
group by o.person
order by o.person desc, case when c.datecompleted is not null then 0 else 1 end asc

ここでは、どちらかのトレーニングが完了した場合、トレーニングは表示されません。

SQLフィドルの例

于 2012-12-03T09:46:44.120 に答える