- ベストアンサー
SQLのsum関数
こんにちは。 PostgresのSQLが思うように動いてくれません!! そのIDを持っている人がどのくらいの数を持っているのかを抽出したいのです。 テーブルは下記です。 ********************************************* ★Aテーブル ID 名前 数 場所 日付 0001 みかん 1 冷蔵庫 0901 0001 みかん 4 倉庫 0901 0001 みかん 1 冷蔵庫 0901 0002 いちご 1 部屋 0901 0002 いちご 2 部屋 0801 0003 きのこ 6 倉庫 0901 ★Bテーブル ID 名前 0001 みかん 0002 いちご 0003 きのこ 0004 あいす ********************************************* となっている場合、下記SQLを実行すると select a.ID ,b.名前 ,sum(a.数) as 数 from Aテーブル a,Bテーブル b where a.日付 >= '0901' and a.日付 <= '0901' and a.ID = b.ID group by a.ID ,b.名前, a.数 結果が 0001 みかん 2 0001 みかん 4 0002 いちご 1 0002 いちご 2 となり0001は合計6で出て欲しいのに別々に出てしまいます。 理想では 0001 みかん 6 0002 いちご 3 で出て欲しいです。 たとえばこの場合、場所によってなど出てしまうものでしょうか? これはなぜなのでしょうか? よろしくお願いします。
- jun2249
- お礼率33% (47/139)
- PostgreSQL
- 回答数3
- ありがとう数7
- みんなの回答 (3)
- 専門家の回答
質問者が選んだベストアンサー
#2です。ちゃんと見ていなかったですが、正規化という意味では、Aテーブルに名前は要らないですね。もしくは、#1さんの言うとおり、JOINする必要はないですね。
その他の回答 (2)
- Samurai-Jack
- ベストアンサー率18% (130/697)
group by a.ID ,b.名前 で、ちゃんと出力されると思います。 数をGroup byに含めると、集計されません。
select ID ,名前 ,sum(数) from Aテーブル where 日付 >= '0901' and 日付 <= '0901' group by ID ,名前 では、ダメですか? 個数の合計だけなら結合は要らないと思いますが・・・
お礼
ありがとうございます。 IDと同じものを出したかったので結合にしたんですがしなくてもよかったようですね。
関連するQ&A
- データ型の変換方法
こんにちは。 前回も同じようなしつもんをしましたがまた問題点がでてきてしまったので質問します。 下記が前回の質問です。困ったことにこの『数』がvarcharなのです。 そうするとa.数とb.数をsumしているところでうまく計算してくれないみたいなのです。(文字列の連結になるようです。) できればここでint型などに一時的に変換して計算させたいのですがいい方法ありませんでしょうか? アドバイスをお願いします。 PostgresでそのIDを持っている人がどのくらいの数を持っているのかを抽出したいのです。 テーブルは下記です。 ********************************************* ★Aテーブル ID 名前 数 場所 日付 0001 みかん 1 冷蔵庫 0901 0001 みかん 4 倉庫 0901 0001 みかん 1 冷蔵庫 0901 0002 いちご 1 部屋 0901 0002 いちご 2 部屋 0801 0003 きのこ 6 倉庫 0901 ★Bテーブル ID 名前 0001 みかん 0002 いちご 0003 きのこ 0004 あいす ********************************************* となっている場合、下記SQLを実行すると select a.ID ,b.名前 ,sum(a.数 + b.数) as 数 from Aテーブル a,Bテーブル b where a.日付 >= '0901' and a.日付 <= '0901' and a.ID = b.ID group by a.ID ,b.名前 結果が 0001 みかん 2 0001 みかん 4 0002 いちご 1 0002 いちご 2 となり0001は合計6で出て欲しいのに別々に出てしまいます。 理想では 0001 みかん 6 0002 いちご 3 で出て欲しいです。 これはなぜなのでしょうか? よろしくお願いします。
- 締切済み
- PostgreSQL
- SQL文でテーブルを作りたいのですが・・・
テーブルを作りたいのですが、思い描くテーブルが作れず、困っています・・・ 例えばMさんがA→B→C→Dと旅行に行ったとします。 そのとき、行った場所によって日付が登録されるようにしたいと思っています。 このように、別な人もいろいろと旅行し、それぞれの日付があり、どんどんと格納していきます。 最初に ID id 日付 date 場所 point (名前はとりあえず、IDとします) でテーブルを作ろうとしましたが、これだとID一つにつき、日付と場所も一つずつしか入りませんよね? どういったテーブルを作ればいいでしょうか? 思い描くテーブルは下記のような感じです。 ID 日付 場所 -------------- 1 |2010/10/06 | A |2010/10/14 | B |2010/10/20 | C |2010/10/25 | D -------------------------- 2 |2010/10/23 | B |2010/10/24 | A |2010/10/25 | D |2010/10/27 | C -------------------------- 3 |2010/10/25 | D |2010/10/27 | C |2010/11/03 | B |2010/11/04 | A |2010/11/07 | D |2010/11/10 | C ------------------------- 4 |2010/11/10 | B |2010/11/15 | A |2010/11/16 | D ・・・・・・・・・・・・・・・ このように一つのIDに対して、日付と場所がランダムの数で格納したいのですが、これって可能でしょうか? テーブルを2つ(以上)作り、外部キーを使ってもかまいません。 また、足りなければ違うIDなどでカバーしてもかまいません。 実際は、このようなテーブルを作り、一人毎の動線を調べるために活用したいと思っています。 Mさん:今日はAに行って、明日はBに行き、明後日はCに行った。すなわち動線は・・・のような感じです。 SQL文でテーブルを作ってください。 補足事項等ありましたらご指摘下さい。追加いたします。 よろしくお願いします。
- ベストアンサー
- MySQL
- 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"を宣言してください」というエラーになります。 書き方が分かりません。。 すいませんが教えていただきたく思います。 よろしくお願いいたします。
- 締切済み
- Oracle
- 簡単なSQLに関して
初歩的なSQLの質問で申し訳ありません。 教えて下さい。 下記のような、ある2つの異なる名前の同項目のテーブルが存在します。 《テーブル》 Aテーブル 社員番号、日付、内容 Bテーブル 社員番号、日付、内容 ※ 内容に関しては、AテーブルとBテーブルで全く違います。 これらの2つのテーブルをマージさせ、社員番号毎の内容毎、日付順に したいと考えています。 どのようなSQLを書けば良いでしょうか?? 尚、テーブルに関しては、諸事情であえて2つに分けてあります。 よろしくお願いします。
- ベストアンサー
- Oracle
- SQL文を教えてください。
特定の日付Xを指定した場合、 以下のような結果になるSQL文を教えてください。 よろしくお願いします。 1) 日付X = 2003-12-17 の場合 ID table_A_DATE table_B_DATE table_C_DATE ------------------------------------------------ 001 2003-12-10 2003-12-12 2003-12-14 002 2003-12-15 ---------- 2003-12-16 003 2003-12-06 2003-12-10 ---------- 004 2003-12-08 ---------- ---------- 2) 日付X = 2003-12-11 の場合 ID table_A_DATE table_B_DATE table_C_DATE ------------------------------------------------ 003 2003-12-06 2003-12-10 ---------- 004 2003-12-08 ---------- ---------- table A(テーブルAには全ユーザのデータがあります) ID DATE ------------------ 001 2003-12-10 002 2003-12-15 003 2003-12-06 004 2003-12-08 table B ID DATE ------------------ 001 2003-12-12 003 2003-12-10 table C ID DATE ------------------ 001 2003-12-14 002 2003-12-16
- ベストアンサー
- その他(データベース)
- このSQL文の意味を教えてください。
SQL勉強中の者です。このSQL文の意味を教えてください。 SELECT A.* FROM table AS A, table AS B WHERE A.id *= B.id AND A.flag = 1 tableにAとBという別名をつけて、Aの全ての項目を抽出しているというところまでは分かりました。 分からないのは「WHERE A.id *= B.id」の部分です。ただの「=」なら分かりますが「*=」って何ですか? あと、AとBのテーブルが同じなのですが、同じテーブルを2つ並べている意味がよく分かりません。 よろしくお願いします。
- ベストアンサー
- その他(データベース)
- SQLでの計算と値の集約について
SQLについて、質問があります。 (質問) 以下のようなDBがあります。 【1のDB】 ID 品目 金額 日付 -------------------------------------------- 1 ミカン 1000 2007/11/1 1 オレンジ 2000 2007/11/1 1 レモン 100 2007/11/1 2 ぶどう 1500 2007/11/1 【2のDB】 区分 品目 金額 日付 ------------------------------------------- a ミカン 1000 2007/11/1 a オレンジ 500 2007/11/1 a レモン 300 2007/11/1 a ぶどう 1500 2007/11/1 b ミカン 100 2007/11/1 b オレンジ 200 2007/11/1 b レモン 500 2007/11/1 b ぶどう 2500 2007/11/1 条件。 1のDBの品目=2のDBの品目 やりたい事。 (1)2のDBの金額(区分=a)×1のDBの金額÷2のDBの金額(区分=b) (2)1のDBのIDで、(1)で得た計算結果を集約 上記DBで具体的に言うと、 1のDBのID=1(ミカン、オレンジ、レモン)のそれぞれの計算結果を計算 (ミカン) 1000×1000÷100=10000 (オレンジ) 500×2000÷200=5000 (レモン) 300×100÷500=30 計算結果を集計(ミカン+オレンジ+レモン) 10000+5000+30=15030 上記の作業をできれば、1回のSQLでやりたいと思うのですが、可能でしょうか? 1回のSQLでは不可能な場合、(1)番だけでもやりたいのですが・・・。 SQLのコーディングがよくわかりません。 ご教授をお願いします。
- ベストアンサー
- SQL Server
- SQLで二つのテーブルを統合したい
お世話になります。 Access2000のSQLで質問させて下さい。 下記のAとBのテーブルがある状態で、二つを統合した Cを生成したいのですが、どのようにSQLを作成したらよいでしょうか? お手数でもうしわけございませんが、SQL文で回答頂ければ助かります。 --テーブルA--- ID 名前 11 やまだ 12 さかもと --テーブルB--- ID 名前 25 きのした 26 つちや --C-- ID 名前 11 やまだ 12 さかもと 25 きのした 26 つちや
- ベストアンサー
- その他(プログラミング・開発)
- SQL HAVING句?集約関数について
SQL HAVING句?集約関数について 現在、SQLを書いているのですが、集約関数についてわからないことがあります。 下記のようなテーブルについて 品番 SEC SUB 倉庫コード 日付 金額 0102A255-**** 100 001 412200 64 20100501 5700 0102A255-**** 100 001 412200 64 20091226 7980 0102A255-**** 100 001 412200 64 20091001 9400 品番をひとつに絞り、かつ最新日付とその金額をもってくるためにはどうしたらいいでしょうか? ようは一番上のレコードのみ抽出したいということです。 どなたかお願いします。
- ベストアンサー
- Oracle
- SQLの書き方
わからないので質問をさせて頂きます。 テーブルAに、money、rank、name、IDと言うカラムがあります。 テーブルBに、IDとpointと言うカラム名があります。 テーブルAのIDを指定し、テーブルBに同じIDが存在する場合 テーブルAとBの値を取得するSQLを書いています。 Select テーブルA.money,テーブルA.rank テーブルA.name,テーブルA.ID,テーブルB.point FROM テーブルA,テーブルB Where テーブルA.ID = '5'; このように書くとmoney,rank,name、IDは重複して表示がされ pointに関してはすべてのpointが表示されてしまいます…。 重複するのでdistinctを使ったのですが うまくいかず…。 SQL初心者ですが、よろしければ教えてください。
- ベストアンサー
- MySQL
補足
ありがとうございます。 できました!! ありがとうございます。 ちなみになんですが また別のテーブル(CテーブルにはAテーブルと同じような内容)がある場合にsumを使わずに+で足しても先に質問したように同じIDのものが何個か出ていました。 どこがまずいですか? これだとgroup byに数をいれないとエラーになっていました。 select ID ,名前 ,a.数 + c.数 as 数 from Aテーブル a,Cテーブル c where 日付 >= '0901' and 日付 <= '0901' group by ID ,名前,a.数,c.数