2017-05-12 12 views
0

が、私はこのテーブルを持っている私は、画像を投稿することができません申し訳ありませんまだはタイプ上のすべてのデータを選択して、行が

image1

この間違った を掲載していますので、もし私をリダイレクトしてくださいここに新しいですが存在する場合に選択変更します私はすべてのタイプ= 'Maladie'を選択したいと思います。 ...タイプ= 'Reprise'の行にmaladieタイプの日付が含まれている場合は、表示する必要があります maladie row date start - > Reprise行の開始日は の代わりに m aladie行日開始 - そのイメージがこの

image2

音符ように見えるため> maladie行日端は

は、その結果:タイプリプライズを持つ行が、または

thnks

存在してもしなくてもよいです
+0

はリプライズは常に一つだけの日をカバーしていますか? 2つのRepriseレコードがメインテーブルレコードに一致することはできますか?何をしたらいいですか? –

+0

はい、それは1日でなければなりません これは病気の休日のテーブルです、あなたはいつもうまく病気の休日が終わる前に仕事に戻ることができます –

答えて

1

外部は再現レコードに参加します。そこmaladie日付範囲ごとに複数のリプライズレコードも、あなたは、その後、使用する最初のものを取りたい場合は

select 
    m.mat, 
    m.start, 
    coalesce(r.end, m.end) as end, 
    m.number_days, 
    m.number_hours 
from (select * from mytable where type = 'Maladie') m 
left join (select * from mytable where type = 'Reprise') r 
       on r.mat = m.mat and r.start between m.start and m.end; 

:試合はあなたが元の日付を使用していないその日を、使用します見つけるどこ:があれば

select 
    m.mat, 
    m.start, 
    coalesce(r.repday, m.end) as end, 
    m.number_days, 
    m.number_hours 
from (select * from mytable where type = 'Maladie') m 
left join 
(
    select mat, min(end) as repday 
    from mytable 
    where type = 'Reprise' 
    group by mat 
) r on r.mat = m.mat and r.repday between m.start and m.end; 
0

あなたが最初の日付をキャッチするために分を使用し、自己参加し、フィルタタイプを作成する必要がありますつ以上のリプライズ

SELECT a.mat 
    ,a.start 
    ,min(coalesce(b.END, a.END)) AS END 
    ,a.number_of_days 
    ,a.number_of_hours 
    ,type 
FROM table1 a 
LEFT JOIN (
    SELECT mat 
     ,start AS start 
     ,END AS END 
    FROM table1 t 
    WHERE t.type = 'Reprise' 

    ) b ON b.start BETWEEN a.start 
     AND a.END and a.mat=b.mat 
WHERE type = 'Malaide' 
GROUP BY a.mat 
,a.start 
ORDER BY start 
+0

標準的なSQLによるとこれは無効です。派生したクエリでは、マットごとにグループ化し、開始点と終了点のうちの1つを取得します(MINやMAXなどの集計関数を使用してどちらを指定するかはわかりません)。 1つのレコードから始まり、別のレコードから終わることはできますが、これはあまりありません。たとえそれが1つのレコードからのデータであっても、あなたは他のものを任意に抑制します。マットごとに複数の再現レコードがあるとき。 –

関連する問題