重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

電子書籍の厳選無料作品が豊富!

以下のテーブルから、ID(001)をキーワードにしてステータスが対になっていない行だけを抜き出して表示させたいのですが、宜しくご教示願います。

【テーブル】
ID ステータス 組織ID 業務ID 名前
----------------------------------------
001 000   00100 0000001 田中
001 001   00100 0000001 田中
001 000   00100 0000002 鈴木
001 001   00100 0000002 鈴木
001 000   00100 0000003 山田
001 000   00100 0000004 佐藤
001 001   00100 0000004 佐藤
001 001   00100 0000005 伊藤
002 000   00101 0000006 吉田
002 001   00101 0000006 吉田


【期待する結果】
ID ステータス 組織ID 業務ID 名前
----------------------------------------
001 000   00100 0000003 山田
001 001   00100 0000005 伊藤

ステータスは基本、000と001は対になっている為、
対になっていないステータスを持つユーザーを抽出したい。
PHPに組み込まれている為、下記の様に$key(ID)を検索キーワードとして式に含めています。

SELECT ID,STATUS,DEPTID,MEMBERID,NAME FROM A_TABLE WHERE ID IN (' .$key .')

質問者からの補足コメント

  • コメントありがとうございます。
    IDと書いたのが誤解を招いてしまいますね。
    わかりやすく言えば、申請ごとの通し番号です。
    業務IDは個人に振られた個人コードのことです。
    申請番号を検索キーにして、ステータスが対になっていない行を抜き出したいのです。
    たぶん、group by 業務ID having count(ステータス)=1
    だと思うのですが、なかなかうまくいきません…

    No.1の回答に寄せられた補足コメントです。 補足日時:2018/02/19 22:13

A 回答 (2件)

質問はoracleということで若干書き方は違うかもしれませんが



・元データ
create table tbl(id char(3),status char(3),sid char(5),gid char(7),name varchar(20));
insert into tbl values
('001','000','00100','0000001','田中'),
('001','001','00100','0000001','田中'),
('001','000','00100','0000002','鈴木'),
('001','001','00100','0000002','鈴木'),
('001','000','00100','0000003','山田'),
('001','000','00100','0000004','佐藤'),
('001','001','00100','0000004','佐藤'),
('001','001','00100','0000005','伊藤'),
('002','000','00101','0000006','吉田'),
('002','001','00101','0000006','吉田');

・集計
select gid from tbl group by gid having count(status)=1;

※結果:0000003と0000005が得られるので

・最終処理
select * from tbl as t1 where exists(
select gid from tbl group by gid having count(status)=1
and gid=t1.gid)
    • good
    • 0
この回答へのお礼

yambejpさん
ありがとうございます!
ご教示頂いた式とはちょっと変わりましたが、一応表示できるようになりました。

お礼日時:2018/02/20 18:37

> ID(001)をキーワード



これは仕様が微妙ですね、IDとステータスの組み合わせは複数あるので
業務ID(もしくは名前)ごとになどの条件になるので?

例示のサンプルですと
group by 業務ID having count(*)>1
的な処理が一番単純な処理になります
この回答への補足あり
    • good
    • 0

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

関連するカテゴリからQ&Aを探す