- ベストアンサー
GROUP化した時の最適なSQL文の書き方
tossy005の回答
- tossy005
- ベストアンサー率38% (7/18)
SELECT A.注文NO ,A.手配日付 ,A.品名 ,SUM(B.入荷数) AS "入荷数" ,AVG(B.単価) AS "単価" From テーブルA AS A LEFT OUTER JOIN テーブルB AS B ON A.注文No = B.注文NO WHERE (A.手配日付 = '2008/01/01') Group By A.注文NO,A.手配日付,A.品名 Order by A.注文NO >テーブルAの注文NOに対して未入荷の場合も「0」で出力します。 未入荷の場合テーブルBに該当注文NOをもつデータが存在しない場合はLEFT OUTER JOIN でNULLが返ってくるので分かります。 データが存在し入荷数が0となっているならばLEFT OUTER JOINではなくINNER JOINを使ったほうが高速化されると思います。
関連するQ&A
- 複雑なSQLを1本でまとめたい
Oracle10gで開発をしています。 1本のSQLで下記のような結果を返したいのですが、 やり方がわかりません。 どなたかご教授頂けないでしょうか? Aテーブル No 注文番号 品番 在庫数 注文数 - ---- -- --- --- 1 001 a001 10 0 2 002 a001 5 5 3 003 b001 10 10 4 004 c001 5 2 5 005 d001 20 0 SELECT * FROM Aテーブル WHERE 在庫数 - 注文数 > 0 結果 No 注文番号 品番 在庫数 注文数 - ---- -- --- --- 1 001 a001 10 0 4 004 c001 5 2 5 005 d001 20 0 となりますが、 これを 結果 No 注文番号 品番 在庫数 注文数 - ---- -- --- --- 1 001 a001 10 0 2 002 a001 5 5 4 004 c001 5 2 5 005 d001 20 0 という風に、1番目の結果+1番目の結果にある商品の 他レコードも抽出したいのですが、どうしたらよいでしょうか?
- ベストアンサー
- Oracle
- SQL文の副問合わせについて
いつも勉強させて頂いています。 SQLの副問合わせでわからないところが出て来ましたので、教えて頂けると助かります。 <環境> VB 2008 SQLSERVER 2005 <内容> 金額の集計をしたいのですが。 テーブルA 品番(主キー) 品名 予測金額 テーブルB 品番(キー) 品名 確定金額 テーブルAの品番に対してテーブルBのレコードが1対多の関係です。 <結果> 品名に「あ」を含むもの、 テーブルAのCOUNT、 テーブルBのCOUNT、 予測金額合計、 確定金額合計 上記結果で出力したいのですが、困っています。 宜しくお願い致します。
- 締切済み
- SQL Server
- SQLを教えてください。
以下に5つのテーブルがあるとします。 (1)全体テーブル ・登録順番号(Key) ・登録名 (2)商品テーブル ・項目コード(Key) ・品名コード(Key) ・商品登録順番号(Key) ・商品サイズ(Key) ・品名 (3)商品単価テーブル ・項目コード(Key) ・品名コード(Key) ・商品登録順番号(Key) ・商品サイズ(Key) ・登録順番号(Key) ・商品単価 (4)新_商品単価テーブル ・項目コード(Key) ・品名コード(Key(Key)) ・商品登録順番号 ・商品サイズ(Key) ・登録順番号(Key) ・新_商品単価 (5)詳細テーブル ・登録順番号(Key) ・品名コード(Key) ・原価項目コード(Key) ・商品数量A ・商品数量B 上記のテーブルから、以下の条件に合致する「(1)の登録名」「(2)の品名」「(4)の新_商品単価×(5)の商品数量※」を取得したい。 ※商品数量Bに値があれば商品数量Bを、値がなければ商品数量A 【条件1】全てAND条件 新_商品単価テーブルの項目コードが100 新_商品単価テーブルの品名コードが50 新_商品単価テーブルの新_商品単価×詳細テーブルの商品数量※<0 商品単価テーブルの商品単価×詳細テーブルの商品数量※>0 ※商品数量Bに値があれば商品数量Bを、値がなければ商品数量A 上記で抽出出来るレコードに加えて、以下 【条件2】全てAND条件 新_商品単価テーブルの項目コードが200~300あるいは400~500 新_商品単価テーブルの新_商品単価×詳細テーブルの商品数量※=0 商品単価テーブルの商品単価×詳細テーブルの商品数量※>0 ※商品数量Bに値があれば商品数量Bを、値がなければ商品数量A どのようなSQLで抽出できますでしょうか?? DBはAccessです。
- 締切済み
- SQL Server
- アクセス クエリ・集計・計算方法について
アクセスの集計機能を使用して、品名毎の数量の合計と金額の合計を算出しようとしていますが、 思うようにできません。どなたか教えてください。 クエリのフィールドを左から・・・ (1)年月: Format([日付],"yyyy/mm")(集計:グループ化) (2)品名(集計:グループ化) (3)品名のカウント(集計機能:カウント) (4)単価(集計:グループ化) (5)金額: [単価]*[品名のカウント](集計:グループ化) このような形でクエリを実行していますが、すべての注文が1つだけなら問題ないのですが、実際には品名には数量が掛けられている場合もあり、現在設定しているクエリ設定では正しい数量の合計と金額の合計を出すことができません。どうか集計方法をご教授いただけないでしょうか。よろしくお願いします。 ■現在のテーブルの設計とリレーションを明記します。 【A】顧客テーブル (1)顧客ID (2)発注コード (3)氏名 【B】商品テーブル (1)商品ID (2)品名 (3)単価 【C】注文テーブル (1)注文ID (2)日付 (3)顧客ID 【D】注文明細テーブル (1)注文明細ID (2)注文ID (3)商品ID (4)数量 リレーション 【A】(1)-【C】(3) 【B】(1)-【D】(3) 【C】(1)-【D】(2)
- ベストアンサー
- オフィス系ソフト
- SQL2008 クエリ文について
いつも皆様に助けていただいてます。 過去に色々聞いているものの、なかなか応用が利かず・・・今回もご支援下さい。 SQL2008に、1つのDBを作っていて、その中にテーブルAとテーブルBがあります。 テーブルAには、1つの会員Noにつき3つのSEQ1~3の行があって、それぞれにポイント数が入ってます。 テーブルA 会員No SEQ Point 1001 1 20 1001 2 30 1001 3 50 1002 1 15 1002 2 10 1002 3 0 テーブルBには、1つの会員につき最大10個のSEQが付きますが、今は殆どカラッポです。 テーブルB 会員No SEQ Rank 1001 1 5 1002 1 5 やりたいことは、テーブルAのSEQ1のポイント数が99以外なら、テーブルBに テーブルAの「会員NO」、SEQ「7」、Rank「1」 の行を挿入したいです。 クエリ実行後のテーブルB 会員No SEQ Rank 1001 1 5 1001 7 1 1002 1 5 1002 7 1 テーブルAのSEQ1のPointが99以外なら、テーブルBに「会員No」とSEQ「7」 とRank「1」を挿入、という概要です。 クエリで可能でしょうか? 先ずは自力である程度やってみるのが筋なんでしょうが、時間が無いので聞いてしまいます。 何卒よろしくお願いします。
- ベストアンサー
- SQL Server
- SQL文(テーブル項目名が特殊文字)
SQL文では、全角の「No.」が特殊文字なため、[ ]でくくらないといけません。 表示項目では、通常これだけで良いのですが、FROM句では、【無効です】のエラーが発生してしまいます。 SELECT [a.受注No.] 受注No,手配数 FROM jyuchu AS a LEFT OUTER JOIN tehai AS b ON [a.受注No.]=[b.手配No.] テーブルの項目名に、このような特殊文字を使用しないのが良いのですが基幹系コンピュータとの関係があり、それもできません。 カッコやASを駆使したのですが、どうしても上手くできません。 良いお知恵がありましたら教えて頂けないでしょうか? よろしく、お願いいたします。
- ベストアンサー
- その他(プログラミング・開発)
- SQL文について教えてください。
お世話になります。 テーブルを3つ作りました ユーザーテーブル:USER_MS USE_NO USER_NAME 001 太郎 002 次郎 003 三郎 品名テーブル:HINMEI_MS HINMEI_NO HINMEI_NAME 001 りんご 002 みかん 003 イチゴ 嫌いなものテーブル:KIRAI_TR KIRAI_NO USER_NO HINMEI_NO 001001 001 001 002003 002 003 002001 002 001 ※KIRAI_NO=USER_NO.HINMEI_NO と連結してプライマリーキーにした ここで、次郎の嫌いなものを抽出するときには $USER_NO = '002'; $SQL ="SELECT * FROM KITAI_TR A,HINMEI_MS B WHERE A.USER_NO = '$USER_NO'; で抽出できるのですが、 次郎の嫌いでない002みかんだけを抽出するSQL文がわからず苦慮しています。 以前、オラクルでSQLを使ったことがあったのですが、その時はFROM句の後に(SELECT * FORM・・・・) Bなどと書くと通ったのですがMYSQLでは通りませんでした。 よろしくお願いします。
- ベストアンサー
- MySQL
- 【再】2)-SQL文の書き方を教えてください。
http://oshiete1.goo.ne.jp/kotaeru.php3?q=694458 先日この問題で投稿しましたが、未完成のため、再度要望を整理し、ご指導をお願いいたします。 W←tabel名:名称、日付、数量 明細データ: 名称 日付 数量 A 2003/10/01 200 B 2003/10/03 500 C 2003/10/10 4000 A 2003/10/03 200 A 2003/10/03 100 C 2003/10/15 100 B 2003/10/15 300 C 2003/10/15 50 B 2003/10/15 60 求めているクエリーのイメージ: 2003/10/15 時点 ================================================ 名称 当日数量 当月数量 A 0 300 B 360 860 C 150 4150 ------------------------------------------------- 先日教えてもらったSQL文、希望のクエリーを作れないです。 -------------------------------------------------- select 名称, sum(AAA) as 当日数量, sum(BBB) as 当月数量 from ( select 名称, 0 as AAA, sum(数量) as BBB from W where 日付 >= #2003/10/01# and 日付 <= #2003/10/15# group by 名称 union select 名称, sum(数量) as AAA, 0 as BBB from W where 日付 = #2003/10/15# group by 名称 ) group by 名称; このSQL文は、2番目のSelectのところでエラーが出る (From句の構文エラーです) -------------------------------------------------- 後、Accessバージョンによって、SQL文が変わるでしょうか?当方は、Access97を使っている。 ご指導をお願いいたします。
- ベストアンサー
- Visual Basic
- GROUP BYと副問い合わせ
SQLで悩んでいるので質問いたします。 テーブル例 日付 タイプ 個数 0901 1 5 0901 1 3 0901 2 2 0901 2 4 0901 3 1 0901 3 2 0902 1 5 0902 1 3 : : とあります。 このデータを日付毎、タイプ毎に個数を取得したいと考えています。 そこで下記のようにSQLを実行 SELECT 日付、sum(個数)asタイプ別個数、タイプ count(*) as タイプ別レコード数 FROM テーブル名 GROUP BY 日付、タイプ ORDER BY 日付、タイプ 取得できるレコードは下記のようになります。 日付 タイプ別個数 タイプ タイプ別レコード数 0901 8 1 2 0901 6 2 2 0901 3 3 2 : となります。 ここまでは簡単にいけたのですが、 できればタイプ別の個数を日付で1レコードで取得できないかと悩んでいます。 期待している取得レコードは下記です。 日付 タイプ1個数 タイプ2個数 タイプ3個数 レコード数 0901 8 6 3 6 0902 : このようにするためにSELECT部分に副問い合わせをしようとしていますがうまくいきません。 SQLで出来る方法があれば、教えてください。 よろしくお願いします。
- 締切済み
- PostgreSQL
- SQLのDELETEについての条件
いつもお世話になってます。 タイトルの通りなのですが、SQLを触れたばかりなので、DELETE文の条件をどう書くか悩んでいます。 以下のテーブルAとテーブルBがあるとします。 テーブルA NO CODE GROUP ---+------+------- 001 A20 AAAA 002 B10 AABB 003 B20 BBBB 004 A20 AABB 005 A10 BBBB 006 B10 AAAA テーブルB NO ID COMMENT ---+------+-------- 001 100 ****** 002 100 ****** 003 120 ++++++ 004 140 <<<<<< 005 170 \\\\\\ 006 110 %%%%%% 007 120 !!!!!! DELETEの条件として行いたいのは テーブルAのCODEが'A20'で、 テーブルAのその条件のNOとテーブルBのNOが同じものの時、条件に合ったテーブルBのレコードを削除したいものです。 例のテーブルでいえば、テーブルAはそのままで、テーブルBが次のようになるようにしたいです。 テーブルB NO ID COMMENT ---+------+-------- 002 100 ****** 003 120 ++++++ 005 170 \\\\\\ 006 110 %%%%%% 007 120 !!!!!! 分かりづらい説明かと思いますが、よろしくお願いします。 不明点があれば、補足にて追加していきます。
- ベストアンサー
- Oracle