- ベストアンサー
こんなSQLの書き方はダメですか?
SQLの書き方を教えてください。 どなたか解る方がいればお願いします。 開発環境 ORACL8.0.5 現状で下記(1)のようなデータがあり条件をつけSOGAKU1の金額に印字の際のデータで必要なSOGAKU2を作りたいのですがうまく行きません。 結果的に下記(2)のようにしたいのですが、SQLを実行すると"式がありません"となります。 条件は同DENNO内でSHOHINCDが同じSEIKYUKBN'1'と'2'が発生した場合SOGAKU2にどちらかのSOGAKU1をもとめる。 同条件でSEIKYUKBNが'1'又は'2'のみしかない場合はSOGAKU2にSOGAKU1の値を代入 (1) TORIHIKICD DENNO DENYMD HUTANKBN SHOHINCD SOGAKU1 KINGAKU 020701 001 20020901 1 A01 10000 9000 020701 001 20020901 2 A01 10000 1000 020701 001 20020901 1 B01 5000 4500 020701 001 20020901 2 B01 5000 500 020701 002 20020901 1 C01 2000 1800 020701 002 20020901 2 C01 2000 200 (2) TORIHIKICD DENNO DENYMD HUTANKBN SHOHINCD SOGAKU1 SOGAKU2 KINGAKU 020701 001 20020901 1 A01 10000 10000 9000 020701 001 20020901 2 A01 10000 0 1000 020701 001 20020901 1 B01 5000 5000 4500 020701 001 20020901 2 B01 5000 0 500 020701 002 20020901 1 C01 2000 2000 1800 020701 002 20020901 2 C01 2000 0 200
- みんなの回答 (9)
- 専門家の回答
質問者が選んだベストアンサー
CREATE TABLE TEST_GOO ( TORIHIKICD NUMBER(7) NOT NULL, DENNO NUMBER(3) NOT NULL, DENYMD NUMBER(8) NOT NULL, HUTANKBN NUMBER(1) NOT NULL, SHOHINCD VARCHAR2(3) , SOUGAKU1 NUMBER(6) NOT NULL, KINGAKU NUMBER(6) NOT NULL ) TABLESPACE JISSEKI_DATA1 STORAGE (INITIAL 512K NEXT 512K PCTINCREASE 0) PCTFREE 10 PCTUSED 40; データの全貌が分からないので、こっちで上記のようなテーブルを作ってみました。 で、No.5の補足に書いてある通りでデータを掘り込んで、下記のSQLを実行しました。 SELECT A.TORIHIKICD, A.DENNO, A.DENYMD, A.HUTANKBN, A.SHOHINCD, A.SOUGAKU1, DECODE(B.KENSU,1,A.SOUGAKU1,DECODE(A.HUTANKBN,'1',A.SOUGAKU1,0)) AS SOUGAKU2, A.KINGAKU FROM TEST_GOO A, (SELECT TORIHIKICD, DENNO, DENYMD, SHOHINCD, COUNT(*) AS KENSU FROM TEST_GOO GROUP BY TORIHIKICD, DENNO, DENYMD, SHOHINCD) B WHERE A.TORIHIKICD = B.TORIHIKICD AND A.DENNO = B.DENNO AND A.DENYMD = B.DENYMD AND A.SHOHINCD = B.SHOHINCD; 結果は以下のようになりました。 TORIHIKICD DENNO DENYMD HUTANKBN SHO SOUGAKU1 SOUGAKU2 KINGAKU ---------- --------- --------- --------- --- --------- --------- --------- 20701 1 20020901 1 A01 10000 10000 9000 20701 1 20020901 1 A01 10000 10000 9000 20701 1 20020901 2 A01 10000 0 1000 20701 1 20020901 2 A01 10000 0 1000 20701 1 20020901 1 B01 5000 5000 4500 20701 1 20020901 2 B01 5000 0 500 20701 2 20020901 1 C01 2000 2000 1800 20701 2 20020901 2 C01 2000 0 200 70701 3 20020901 1 A01 10000 10000 9000 70701 3 20020901 2 A01 10000 0 1000 70702 4 20020901 1 A01 10000 10000 9000 70703 5 20020901 2 A01 10000 10000 10000 numberタイプの項目をdecodeする際にシングルコーテーション付きでも うまくいきました。(ちなみになくても同じ結果がでました) あれから進展はありましたか?
その他の回答 (8)
- taka_tetsu
- ベストアンサー率65% (1020/1553)
確認です。 >4件とも0と表示されるって事は伝票行数が2以上でHUTANKBNを'1'以外と >判断してるってことですよねえ??? HUTANKBNの属性が実はNUMBER型なんてことありません?
お礼
ご親切にありがとうございました。 昨日、何とかうまく行きました! どうもありがとうございました。又よろしくお願いします。
- bobble
- ベストアンサー率34% (111/323)
DECODEが効いてない?なんて事があるのかなあ。 4件とも0と表示されるって事は伝票行数が2以上でHUTANKBNを'1'以外と 判断してるってことですよねえ??? もう少し調べてみます。
- bobble
- ベストアンサー率34% (111/323)
確認です。 020701 001 20020901 1 A01 10000 0* 9000 020701 001 20020901 1 A01 10000 0* 9000 020701 001 20020901 2 A01 10000 0* 1000 020701 001 20020901 2 A01 10000 0* 1000 この4件は見た所2件ずつダブっているように見えるんですが 本当に明細データは4件あるんですか? 実際は2件しかないのであればwhere文の条件が少ないとか、 group byの条件を見直すなど、もう少し考えてみる必要があると思います。 後、結果が出てきたときのselect文を見てみたいのですが・・・
補足
>この4件は見た所2件ずつダブっているように見えるんですが 本当に明細データは4件あるんですか? 実はビューなんですが、ビューからデータをとってくることにしたので 自在データではないにしろデータはちゃんと4件あります。 一応下記の文です。 SELECT T1.SEIKYUSAKICD, T1.SEIKYUSAKINM, T1.TORIHIKICD, T1.HUTANKBN, T1.DENPYONO, T1.NAMEKANA12, T1.NAMEKANJI12, T1.RYAKUTIKU1, T1.RYAKUTIKU2, T1.SEIKYUNO, T1.SIMEYMD, T1.SIMEYMD2, T1.SOGAKU AS SOGAKU1, DECODE(T2.NUM,1,T1.SOGAKU,DECODE(T1.HUTANKBN,'1',T1.SOGAKU,0)) AS SOGAKU2, T1.JIKOFUTAN, T1.KINGAKU1, T1.KINGAKU2, T1.KYUHUNO, T1.SHOHINCD, T1.SHOHINNM, T1.JISSEKIYMD FROM VKAID07 T1, (SELECT SEIKYUSAKICD,TORIHIKICD, DENPYONO, JISSEKIYMD, COUNT(HUTANKBN) NUM, SHOHINCD FROM VKAID07 GROUP BY SEIKYUSAKICD,TORIHIKICD, DENPYONO, JISSEKIYMD, SHOHINCD) T2 WHERE T1.SEIKYUSAKICD = T2.SEIKYUSAKICD AND T1.TORIHIKICD = T2.TORIHIKICD AND T1.DENPYONO = T2.DENPYONO AND T1.JISSEKIYMD = T2.JISSEKIYMD AND T1.SHOHINCD = T2.SHOHINCD
- bobble
- ベストアンサー率34% (111/323)
>T1.JISSEKIYMD, FROM VKAID07 T1, 実際のsqlをコピペしているにであれば fromの前のT1.JISSEKIYMDの後にカンマがまずいと思いますよ。
補足
早速の回答ありがとうございます。 一応結果はでたのですが、出て欲しい金額が出てきません。 下記(2)の場合*の部分が全て0になってしまいます。 (2) TORIHIKICD DENNO DENYMD HUTANKBN SHOHINCD SOGAKU1 SOGAKU2 KINGAKU 020701 001 20020901 1 A01 10000 0* 9000 020701 001 20020901 1 A01 10000 0* 9000 020701 001 20020901 2 A01 10000 0* 1000 020701 001 20020901 2 A01 10000 0* 1000 020701 001 20020901 1 B01 5000 5000 4500 020701 001 20020901 2 B01 5000 0 500 020701 002 20020901 1 C01 2000 2000 1800 020701 002 20020901 2 C01 2000 0 200 070701 003 20020901 1 A01 10000 10000 9000 070701 003 20020901 2 A01 10000 0 1000 070702 004 20020901 1 A01 10000 10000 9000 070703 005 20020901 2 A01 10000 10000 10000 同じ伝票番号で同じ取引先CDで同じ商品が2個以上の場合は0になってしまうようです。
- bobble
- ベストアンサー率34% (111/323)
No.3で答えたbobbleです。ちょっと補足です。 decode(kensu,1 → の 1 ですが 同一伝票で同一商品が2件までしか発生しないのであれば taka_tetsuさんのdecode条件で全然OKですが、 もし3件以上発生する場合は最初に1で判断させて、それ以外の条件とした方が いいと思います。
- bobble
- ベストアンサー率34% (111/323)
taka_tetsuさんと良く似た回答になりました。 まあ頑張って作った(笑)ので載せさせて下さい。 ちょっとわからない条件もあるので、詳しくは書けませんが・・・ <私が勝手に作った条件(笑)> その1 >条件は同DENNO内でSHOHINCDが同じSEIKYUKBN'1'と'2'が発生した場合SOGAKU2にどちらかのSOGAKU1をもとめる。 この”もとめる”ってのが引っかかります。 (1)のデータの項目”SOGAKU1”をみると既に伝票内の商品毎にSUMされている金額が入っている? なのに求める? (2)が最終データと考えた場合に、同一伝票内の商品でどちらか一行にSOUGAKU2にSOUGAKU1の値を代入し、 それ以外は0と代入する事にしました。 その2 >SEIKYUKBN'1'と'2'が発生した場合 (1)のデータ内にSEIKYUKBNが無いのでHUTANKBNで判断することにします。 その3 同一伝票内に同一商品CDが2件以上発生した場合のSEIKYUKBNはどれかのレコードが'1'になっている。 その5 テーブル名はAAAにします。 SELECT A.TORIHIKICD, A.DENNO, A.DENYMD, A.HUTANKBN, A.SHOHINCD, A.SOGAKU1, DECODE(B.KENSU,1,SOUGAKU1,DECODE(SEIKYUKBN,'1',SOUGAKU1,0)) AS SOUGAKU2, A.KINGAKU FROM AAA A, (SELECT TORIHIKICD, DENNO, DENYMD, SHOHINCD, COUNT(*) AS KENSU FROM AAA GROUP BY TORIHIKICD, DENNO, DENYMD, SHOHINCD) B WHERE A.TORIHIKICD = B.TORIHIKICD AND A.DENNO = B.DENNO AND A.DENYMD = B.DENYMD AND A.SHOHINCD = B.SHOHINCD とこんな感じですね。 ただし、条件にも書いている通り,SEIKYUKBNは同一伝票で同一商品が複数発生する 場合は、その中の1件に必ず1があるのが条件です。 後、件数を取る時のGROUP BYは勝手に決めたので、必要に応じて変更して下さい。
- taka_tetsu
- ベストアンサー率65% (1020/1553)
SQLちょっと間違えました。 COUNT()の別名の付け忘れです。 SELECT TORIHIKICD, DENNO, DENYMD, HUTANKBN, SHOHINCD, SOGAKU1, DECODE(T2.NUM, 2, DECODE(HUTANKBN, '1', SOGAKU1, 0), SOGAKU1) SOGAKU2, KINGAKU FROM テーブル名 T1, (SELECT TORIHIKICD, DENNO, DENYMD, COUNT(HUTANKBN) NUM, SHOHINCD FROM テーブル名 GROUP BY TORIHIKICD, DENNO, DENYMD, SHOHINCD) T2 WHERE T1.TORIHIKICD = T2TORIHIKICD AND T1.DENNO = T2.DENNO AND T1.DENYMD = T2.DENYMD AND T1.SHOHINCD = T2.SHOHINCD;
補足
早速の回答ありがとうございます。 下記の文でやってみたところ結局同じ"式がありません"エラーです。 どうやらFROM VKAID07 T1の部分でエラーになっているようです。 SELECT T1.SEIKYUSAKICD, T1.SEIKYUSAKINM, T1.TORIHIKICD, T1.HUTANKBN, T1.DENPYONO, T1.NAMEKANA12, T1.NAMEKANJI12, T1.RYAKUTIKU1, T1.RYAKUTIKU2, T1.SEIKYUNO, T1.SIMEYMD, T1.SIMEYMD2, T1.SOGAKU AS SOGAKU1, DECODE(T2.NUM, 2, DECODE(T1.HUTANKBN,'1',T1.SOGAKU,0),T1.SOGAKU) AS SOGAKU2, T1.JIKOFUTAN, T1.KINGAKU1, T1.KINGAKU2, T1.KYUHUNO, T1.SHOHINCD, T1.SHOHINNM, T1.JISSEKIYMD, FROM VKAID07 T1, (SELECT TORIHIKICD, DENPYONO, JISSEKIYMD, COUNT(HUTANKBN) NUM, SHOHINCD FROM VKAID07 GROUP BY TORIHIKICD, DENPYONO, JISSEKIYMD, SHOHINCD) T2 WHERE T1.TORIHIKICD = T2.TORIHIKICD AND T1.DENPYONO = T2.DENPYONO AND T1.JISSEKIYMD = T2.JISSEKIYMD AND T1.SHOHINCD = T2.SHOHINCD;
- taka_tetsu
- ベストアンサー率65% (1020/1553)
補足をお願いします。 1.”SQLを実行すると"式がありません"となります。”のSQLは? 2.SEIKYUKBNとは? SEIKYUKBNがHUTANKBNのことであるならば、次のような感じでいけそうですが。 SELECT TORIHIKICD, DENNO, DENYMD, HUTANKBN, SHOHINCD, SOGAKU1, DECODE(T2.NUM, 2, DECODE(HUTANKBN, '1', SOGAKU1, 0), SOGAKU1) SOGAKU2, KINGAKU FROM テーブル名 T1, (SELECT TORIHIKICD, DENNO, DENYMD, COUNT(HUTANKBN), SHOHINCD FROM テーブル名 GROUP BY TORIHIKICD, DENNO, DENYMD, SHOHINCD) T2 WHERE T1.TORIHIKICD = T2TORIHIKICD AND T1.DENNO = T2.DENNO AND T1.DENYMD = T2.DENYMD AND T1.SHOHINCD = T2.SHOHINCD;
補足
すいません。 800文字を越えてしまって・・ 1、の補足 DECODE(T_NYUKINZANMEISAI.HUTANKBN,'1',T_NYUKINZANMEISAI.SOGAKU, DECODE((SELECT COUNT(*) FROM T_NYUKINZANMEISAI T_NYUMEI1 WHERE T_NYUKINZANMEISAI.DENPYONO = T_NYUMEI1.DENPYONO AND T_NYUKINZANMEISAI.SHOHINCD = T_NYUMEI1.SHOHINCD AND T_NYUMEI1.HUTANKBN = '1' ),0,T_NYUKINZANMEISAI.SOGAKU,0) ) AS SOGAKU2, 上記のSQL文はSELECT文の一部を抜粋した物ですが、こんな感じです。 2、の補足 SEIKYUKBNがHUTANKBNのことです。
お礼
ご親切にありがとうございました。 昨日、何とかうまく行きました! どうもありがとうございました。又よろしくお願いします。