2017-01-09 7 views
0

ステータスコードが「DE」の人物IDを含む結果セットを1つの時間枠からステータスコード「PE」に変換するSQL文が必要です。別の時間枠の間。 例テーブル2つの日付範囲の結果セットを取得するためのSQL

id | name 
--- ------ 
1 Joe 
2 Jane 

status | start_date | end_date | person_id 
------- ------------ ----------- ----------- 
    DE 2016-12-01 2016-12-28 1 
    PE 2017-02-01 2017-02-28 1 
    DE 2016-12-01 2016-12-28 2 

「DE」期間は、2016年12月1日と2016年12月28日の間であり、「PE」期間は、私が希望2017年2月1日と2017年2月28日の間であった場合クエリセットにJoeが返されることを期待します。

答えて

0

私はあなたが必要なものを理解していませんでした。

しかし、このような問題を持つ

SELECT * FROM table1 where (select count(*) from table2 where table1.id = table2.person_id and (([status] = 'DE' and start_data between '2016-12-01' and '2016-12-28') or ([status] = 'PE' and start_data between '2017-02-01' and '2017-02-28')) > 0 
1

あなたの最善の策は、別々のSQLにそれらを打破するため、二回この表で行くことです。一度PEため、再びDEとのために:

今、あなたはあなたがお互いに対してテストすることができて、結果セットに対して持っている
SELECT name FROM table WHERE status = 'DE' and start_date = '2016-12-01' AND end_date = '2016-12-28'; 

SELECT name FROM table WHERE status = 'PE' and start_date = '2017-02-01' AND end_date = '2017-02-28'; 

SELECT name 
FROM 
    (SELECT name FROM table WHERE status = 'DE' and start_date = '2016-12-01' AND end_date = '2016-12-28') t1 
    INNER JOIN (SELECT name FROM table WHERE status = 'DE' and start_date = '2016-12-01' AND end_date = '2016-12-28') t2 ON t1.name = t2.name; 

あなたが実際に選択されていませんので、

良く行うことが
SELECT name 
FROM table t1 
WHERE 
    status = 'DE' and 
    start_date = '2016-12-01' AND 
    end_date = '2016-12-28' AND 
    name IN (SELECT name FROM table t2 WHERE t1.name = t2.name status = 'PE' and start_date = '2017-02-01' AND end_date = '2017-02-28'); 

:二派生テーブル、あなたは同じロジックを使用して、同様に相関サブクエリでこれで行くことができます。

0

私はあなたが使用しているSQLいるか分からないが、このクエリは

select Res.name from (
       select * from table1 inner join table2 on Table1.id = Table2.person_id 
       where (status = 'DE' and start_date >= '2016-12-01' and end_date <= '2016-12-28') 
       or 
       (status = 'PE' and start_date >= '2017-02-01' and end_date <= '2017-02-28') 
        ) as Res 
    group by Res.name having count(*) > 1 

PostgreSQLの

で正常に動作する必要がありますまたはあなたが

select table1.name from table1 
inner join table2 t1 on table1.id = t1.person_id 
where status = 'DE' and start_date >= '2016-12-01' and end_date <= '2016-12-28' 
and 
exists (select 1 from table2 t2 where t2.person_id = t1.person_id and 
status = 'PE' and start_date >= '2017-02-01' and end_date <= '2017-02-28') 
だけでなく、この文を使用することができます
関連する問題