SQL抽出の書き方について(一部行の削除)

このQ&Aのポイント
  • SQLの書き方について質問です。VIEW(SQL)を作成した時に結果が特定の条件を満たさない行を削除したいです。
  • 本来なら特定の条件を満たさない行を削除したいです。具体的にはSEIHIN_CD,KOJO_CD,CAL_DATEの3つを主キーとして、重複キーの一番上の行のみ残すようにしたいです。
  • SQL(PL/SQL?)の書き方がわからないので、どなたか教えていただけますと助かります。
回答を見る
  • ベストアンサー

SQL抽出の書き方について(一部行の削除)

SQLの書き方について質問です。 VIEW(SQL)を作成した時に結果が以下のようになりました。 -------------------------------------- SEIHIN_CD KOJO_CD CAL_DATE KEIKAKU -------------------------------------- 001111    430    20060724    1000 001111    430    20060724    0 001111    430    20060725    0 001111    431    20060724    0 本来なら、SEIHIN_CD,KOJO_CD,CAL_DATEの3つを主キーとしたいので 表の一番上の2行のうちKEIKAKU=1000の方を残しKEIKAKU=0の方を削除したいと思います。 (重複キーの一番上の行のみ残します) 削除したいというよりは本来なら下記のような抽出を行いたいです。 -------------------------------------- SEIHIN_CD KOJO_CD CAL_DATE KEIKAKU -------------------------------------- 001111    430    20060724    1000 001111    430    20060725    0 001111    431    20060724    0 SQL(PL/SQL?)の書き方が解らないのでどなたか教えていただけますと助かります。 文字制限がありますので説明が簡素になりますが、こちらのページを見てSQLを作成しています。 http://oraclesqlpuzzle.hp.infoseek.co.jp/7-64.html 以下が作成したSQLになります。 SELECT distinct a.SEIHIN_CD,a.KOJO_CD,b.CAL_DATE,decode(a.YMD,b.CAL_DATE,a.KEIKAKU,0) as KEIKAKU,b.CAL_WEEK,b.CAL_KBN from (select SEIHIN_CD,KOJO_CD,KEIKAKU,YMD from T_SEISAN_KEIKAKU) a,M_00_CALENDER b order by seihin_cd,kojo_cd,cal_date,keikaku desc カレンダーのテーブル=M_00_CALENDER 売上テーブル=T_SEISAN_KEIKAKUとなっています。 以上となりますがよろしくお願いいたします。

  • Oracle
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • trictrac
  • ベストアンサー率38% (10/26)
回答No.1

3つのキーで集約したら良いのでは内のでしょうか。 select A.SEIHIN_CD, A.KOJO_CD, A.CAL_DATE, A.KEIKAKU , B.CAL_WEEK, B.CAL_KBN from ( selet SEIHIN_CD , KOJO_CD , CAL_DATE , sum( decode( A.YMD, B.CAL_DATE, A.KEIKAKU,0 ) ) as KEIKAKU from T_SEISAN_KEIKAKU A group by SEIHIN_CD , KOJO_CD , CAL_DATE ) , M_00_CALENDER B

hiyokohiyo
質問者

お礼

ご回答ありがとうございます。SUMとGROUPを使うのですね。 早速やってみました。 ちょっと上手くいかないところがあったのでこちらで修正させてもらったところ無事になりました。大変助かりましたありがとうございました! 一応その部分のSQLソースを貼っておきます。 select SEIHIN_CD,KOJO_CD,CAL_DATE, sum( decode(A.YMD,B.CAL_DATE,A.KEIKAKU,0 )) as KEIKAKU from T_SEISAN_KEIKAKU A,M_00_CALENDER B group by SEIHIN_CD,KOJO_CD,CAL_DATE order by seihin_cd,kojo_cd,cal_date

関連するQ&A

  • Pro*で副問い合わせができない

    こんにちは、現在Oracle9 Pro*C を使った開発をしているのですが、下記のSQLで 副問い合わせをしているのですが、コンパイルエラーが 出てしまいます。エラー内容は 「PCC-S-02201, 記号"SEISAN_YMD"が見つかりました。」 と表示されます。SQLPlus上では問題なく検索 されるのですが、C上だとうまくいきません。 なにか足りないのでしょうか? EXEC SQL DECLARE cur4 CURSOR FOR SELECT DISTINCT b.KEIKAKU_SAKUTEI_KBN, a.SEISAN_YMD, (SELECT SEISAN_YMD FROM VIWDKJSEIS ) from VIWDKJSEIS a, TBLDKJSTNR b,TBLDKJSIRB c where b.KEIKAKU_SAKUTEI_KBN = c.KEIKAKU_SAKUTEI_KBN AND a.SEISAN_YMD = b.SAGYO_YMD AND b.SAGYO_YMD = c.SAGYO_YMD AND TO_CHAR(a.SEISAN_YMD,'YYYY/DD') = :db_senko_taisyo_ym_m;

  • (SQL)日数の計算

    こんにちは、kwnshと申します。 SQLで SELECT to_char(last_day(SEISAN_YMD),'dd') FROM VIWDKJSWBF M; テーブルに格納されている月の日数を求めた後、 違うテーブルの項目(HHHMM)形式の データの減算を行いたいのですが、 なにかいい方法はないでしょうか?

  • 日付型(時刻含む)を抽出条件にして行を抽出したい。

    はじめまして、よろしくお願いします。 現在SQLサーバー2000を使用してこの処理を行おうと思っております。 一度テーブルに格納したデータをSELECT文を使って抽出したい と思っているのですが、WHERE条件に日付型のフィールドを指定するとうまく行きません。(時刻が日付型のフィールドに入っている場合、うまくいきません。) やっていることは YMD(DATE型・主キー)、ID(VERCHAR型・主キー)、NAME(VERCHAR型) というのテーブル(テーブル名:MEIBO)に入っている 2002/02/02 14:10:55、0001、山田 太郎 というデータを 取込年月日、個人IDを指定して特定の列を取り出そうとしています。 SQL文は SELECT * FROM MEIBO WHERE YMD = '2002/02/02 14:10:55' AND ID = "0001' と記述していますが、一件もヒットしません。 DATE型のフィールドにはINSERTするときにGETDATE()をつかってシステム日付を 格納するようにしています。 GETDATE()ではなく、DATE()を使ってシステム日付を格納した 2002/02/02、0001、山田 太郎 という時刻の入っていないデータに対しては SELECT * FROM MEIBO WHERE YMD = '2002/02/02' AND ID = "0001' というSQL文でヒットするのですようです。 時刻が入ったらそのフィールドを抽出条件として使うことは無理なのでしょうか? 基本的な部分で勘違いしているのかもしれませんが なにかお気づきの点がありましたら、ご教授ください。

  • SQL 条件付きDELETE文について

    SQLを見よう見まねでいじることになりました。。 AテーブルからBテーブルの以下の条件が当てはまるデータを削除する SQLを作りたいと考えています。  (1)Bテーブルの『DAT_FLG』が1  (2)A.テーブル『KNR_NO』 と Bテーブル『KNR_NO』が同じ  (3)Aテーブル『STR_YMD』 と Bテーブル『STR_YMD』が同じ  (4)Aテーブル『END_YMD』 と Bテーブル『END_YMD』が同じ 以下のようなSQLを考えましたがエラーとなってしまいました。 DELETE FROM A JOIN B ON A.KNR_NO = B.KNR_NO and A.STR_YMD = B.STR_YMD and A.END_YMD = B.END_YMD B.DAT_FLG = '1' DBはoracleを使っています。 どなたか教えてください。

  • SQLの書き方を教えてください。

    初めまして。sql初心者です。OracleのSQLについて質問があります。 「update Aテーブル set Aテーブル.構成順 = (select Bテーブル.順番 from Bテーブル where Aテーブル.ID = Bテーブル.ID and Aテーブル.種類 = Bテーブル.種類CD)」 こういった内容のSQLって発行できるんでしょうか。 Bテーブル.種類CDの"種類CD"で「コンポーネント"種類CD"を宣言してください」というエラーになります。 書き方が分かりません。。 すいませんが教えていただきたく思います。 よろしくお願いいたします。

  • グループ中で最大値を含む行を抽出するSQLはどう書けば良いでしょうか

    列A,Bでグループ化し、グループ中で列Cが最大値の列を取得したいのです。 数百万件あるので極力低コストにしたく、 副問合せはINDEXが効かないと聞いたのですが、 それ以外思いつきませんでした。 副問合せしない方法はないでしょうか? また、副問合せの中でコストの低いSQLはどんなものでしょうか。 ■テーブルです 名前 型 CUST_ID CHAR(8) BRANCH_ID CHAR(4) VALID_DATE DATE MYDATA VARCHAR2(20) CUST_ID BRAN VALID_DA MYDATA 19740704 0000 06-01-01 comment0001 19740704 0000 05-12-01 comment0000 19740704 0000 06-02-01 comment0002 19740704 0001 06-01-01 comment0011 19740704 0001 06-03-01 comment0012 ■このような結果が欲しいのですが。。。 CUST_ID BRAN VALID_DA MYDATA 19740704 0000 06-02-01 comment0002 19740704 0001 06-03-01 comment0012 ■考えたSQLです(検証済) select a.cust_id,a.branch_id,a.valid_date,a.mydata from test a,(select cust_id,branch_id,max(valid_date) as mvd from test group by cust_id,branch_id) b where a.cust_id=b.cust_id and a.branch_id=b.branch_id and a.valid_date=b.mvd ; select a.cust_id,a.branch_id,a.valid_date,a.mydata from test a where not exists (select * from test b where a.cust_id=b.cust_id and a.branch_id < b.branch_id) ; select cust_id,branch_id,valid_date,mydata from test where (cust_id,branch_id,valid_date) in (select cust_id,branch_id,max(valid_date) from test group by cust_id,branch_id) ; select cust_id,branch_id,valid_date,mydata from (select cust_id,branch_id,valid_date,mydata,max(valid_date) over(partition by cust_id,branch_id) as mvd from test) where valid_date=mvd ;

  • SQLについて

    SELECT テーブル名.A テーブル名.B FROM テーブル名 WHERE テーブル名.A = Y テーブル名.B = Z SELECT 別テーブル名.A 別テーブル名.B FROM 別テーブル という2つのSQLがあったとします。この時、別テーブルのSELECT文より取得してきた、AとBを上の式の条件(Y,Z)で両方同時に使用したい場合、どのようなSQLを書いたら良いのでしょうか? 1文にまとめて書く場合です。

  • 別テーブルからSELECTした値を持つ行を削除するSQLは?

    削除 SQL がわかりません。 SQL-1 SELECT id FROM table2 WHERE date_in IS NULL; これで取得したidを持つレコード(別テーブル)を削除したいのですが、 どうすれば組み合わさるのでしょうか? DELETE FROM table1 WHERE id=???

  • 【至急】SQLの結合について教えてください。

    select * from A where ab = '1' and cd = '2' select ef from B where ab = '1' and cd = '2' and ef = '3' 至急質問させてください。 上記SQLを結合したいです。(Oracleです) 取得したいデータはAのテーブルの全項目で、 取得条件として、Bのテーブルの項目ef = '3' だったらという条件を加えたいです。 キー項目は両テーブルとも同じ(ab, cd)です。 どのようなSQLがスマートでしょうか。。 無知で申し訳ございませんが、ご教授いただけますと幸いです。 よろしくお願いいたします。

  • 【至急】SQLの結合について教えてください(2)

    select * from A select ef from B where ef = '3' かつ、A.ab = B.ab and A.cd = B.cd 至急質問させてください。 上記SQLを結合したいです。 取得したいデータはAのテーブルの全項目で、 取得条件として、Aのテーブルのキー項目 = Bのテーブルのキー項目に、Bのテーブルの項目ef = '3' だったらという条件を加えたいです。 どのようなSQLがスマートでしょうか。。 無知で申し訳ございませんが、ご教授いただけますと幸いです。 よろしくお願いいたします。 ※キー項目の値は条件に指定できない(持っていない)ことがわかりました。 先ほどの質問にご回答下さった皆様、申し訳ございません。