• 締切済み

MySQL5で、SUMした値を新たにカラムとして追加したビューを作成し

MySQL5で、SUMした値を新たにカラムとして追加したビューを作成したいのですが、どういうSQLを書けばよいかわかりません。 今、Aというテーブルがあり、f1,f2,f3というカラムがあります。 このテーブルを元にvwAというビューを作成したいのですが、その際、f1でGroup Byしたf2のSUMをf2Keiというカラム名で追加し、最終的にf3とf2Keiという2つのカラムを持ったビューにしたいです。 create view vwA as select f3,select SUM(f2) as f2Kei from A GROUP BY f1 from A; と書いてみましたがエラーを返されました。 どのようなSQLを書けばよいか、ご教授ください。

noname#226333
noname#226333
  • MySQL
  • 回答数2
  • ありがとう数32

みんなの回答

回答No.2

やりたいことを、具体的に提示してください。 「どういった母体データから、どういう結果を得たい」といったことの説明なしに、他人には適切なアドバイスはできません。 f1でグループ化したら、f3も一意になるのですか? もしそうであれば、一般的なSQLとしては文法エラーですが、”MySQLでは拡張仕様”で動きます。 もし一意にならないなら、誤った”MySQLの拡張仕様”の使用になります。 f3が年度で、2009とか、2010とか入っているのでしょうか? f1は月で、1~12とかが入っているのですか?それとも、年月が入っているのですか? もし、1~12といった値が入っているなら、group byで結果は12行できる訳ですよね? そして年度とは、どのようにくっつけるというのでしょうか??? 単年度しか集計しないように、検索条件を指定する? →もしそうなら、そういった提示があって当然ですよね? 年度に関係なく、月別で集計したい? →もしそうなら、結果に年度をどのようにくっつけるのですか?

回答No.1

MySQL5といった書き方はやめましょう。MySQLは、4.0以前と4.1以降では、大きな機能追加があり、一部の仕様変更があります。また、MySQL 5.0、5.1も同様です。さらには、一部機能では、MySQL 5.1.xxで仕様変更なんてのもあります。 まず、文法の誤り。 select句中にサブクエリを書く場合は、()で囲む必要があります。 例えば、こんな感じ。 select c1,(select c2 from t2 where ・・・) as x from t1 次に、SQLとしての誤り。f3とf1、f2の関係が不明。 標準SQLや主要なRDBMSでは、group by指定時、select句で指定できるのは、 (1)group byで指定した列 (2)maxなどの集計関数 (3)定数 といったもので、それ以外の列を指定することは許されません。 今回のケースでは、f3がどの行のf3かを決められません。MySQLの標準の設定では、これをエラーにせず、結果もユーザ責任という利用者が誤りやすい仕様になっています。

noname#226333
質問者

お礼

ご回答ありがとうございます。 説明不足で申し訳ありませんでした。 MySQlのバージョンは5.1.39でした。 f1が月度、f2が売り上げ、f3が年度、で、 select SUM(f2) as f2Kei from A GROUP BY f1 from A; という記述で、f1の月度ごとにf2の売り上げを集計して、それをf2Keiというカラム名で新しくビューに追加したかったのです。f3はテーブルからそのままビューに持ってくるだけ、ということです。 初心者なので、SQL自体あまり理解できておらず、おかしな質問になっているかもしれません。すみません。 その後、 create view vwA as select f3,SUM(f2) as f2Kei from A GROUP BY f1; で、やりたいことができた感じなのですが、間違ってますでしょうか? サブクエリを()で囲むということなので、本来は create view vwA as select f3,(select SUM(f2) as f2Kei from A GROUP BY f1) from A; が正しい記述ということになるのでしょうか?

関連するQ&A

  • MySQL4でViewの代わりにできますか?

    PostgreSQLで下記のようなビューを作成し、そのビューから日付でgroupbyして日付ごとのユニーク件数を取っていました。 ---------------------------------------------- create view v_uniqcountday as select substring(datetime, 1, 8) as date, uniqid, careercd, count(*) as cnt from accesslog group by date, uniqid, careercd order by date; select date, count(*) as cnt from v_uniqcountday where (date >= xxx) and (date < xxx) group by date; ---------------------------------------------- しかし、MySQLではViewは作成できないようです。 そこでselect文のみで上記のような集計は可能でしょうか? よろしくお願いいたします。

  • MySQLのSUM関数について

    いつもお世話になっております。 宜しくお願い致します。 MySQLのSUM関数についてお聞きしたいのですが、データベースから特定の条件のカラムだけ合計をするという事はできないのでしょうか? たとえば・・・ hoge_table +------+-------+-------+ | user | data1 | data2 | +------+-------+-------+ | hoge | 1 | 0 | | hoge | 2 | 0 | | hoge | 1 | 1 | | hoge | 2 | 1 | +------+-------+-------+ というデータベースがあり、ここからdata1が1の場合の合計を集計するにはどうすれば良いのでしょうか? さらに、data1が2で、data2が0の場合といった複数の条件を指定して合計を出したいのですが、 方法が思いつきません。 select *, if(data1 = '1',sum('1'),'') as direct_dispatch_1 from hoge_table group by user とやってみたのですが、結果は4になってしまいました。 何か良い方法はございませんでしょうか?

    • ベストアンサー
    • MySQL
  • MySQLのCREATE VIEWがうまく動作しません。

    SQL初心者です。今回仕事で使う事になり、Win98に MySQL Ver3.23.51をインストールしたのですが、 CREATE VIEW文がうまく動作しません。 例えば MAIN と言うテーブルが存在する時に MySQLプロンプト上で SELECT * FROM MAIN; とやるとちゃんと動作して表示してくれるのですが、 これをTEMPと言うビューを作成したい場合に CREATE VIEW TEMP AS SELECT * FROM MAIN; とやると ERROR 1064: You have an error in your SQL syntax near \'VIEW TEMP AS SELECT * FROM MAIN\' at line 1 と出て来てしまいます。文法的には間違ってないはずなのですが、何がいけないのでしょうか?MySQLはCREATE VIEW文をサポートしていないのでしょうか? 周りに詳しい人間がいないので、原因がわからなくて つまづいています。どうかよろしくお願いします.

  • MySQLで対象期間を決め集計しランキングする方法

    MySQLの初心者ですが、対象期間で集計を行いランキング付けし任意の上位何位までを抽出する方法について教えてください。 全データから集計後上位5位を選ぶ場合・・同順有り select x.`品名`,x.kei,(select count(*)+1 from (select `品名`,sum(`金額`) as kei from uriage group by `品名`) y where x.kei<y.kei ) as rank from (select `品名`,sum(`金額`) as kei from uriage group by `品名`) x having rank <= 5 order by rank といろいろ参考にしてで出来ましたが。任意の対象期間(日付)を設定して実行するSQL文が思いつきません。どこに期間を挿入するのか・・・悪あがきで思い付いた方法として CREATE OR REPLACE VIEW uriage_01 AS SELECT `品名`,SUM(`金額`) AS `金額` FROM uriage WHERE `日付` BETWEEN "2001/01/01" AND "2001/01/31" GROUP BY `品名` で任意期間の集計結果のビューを作りそのビューから select r1.`品名` as `品名`, r1.`金額` as p, count(r2.`金額`)+1 as rank from uriage_01 as r1 left join uriage_01 as r2 on r1.`金額` < r2.`金額` group by r1.`品名` having rank <= 5 order by rank と手間の掛かる方法です。単純に5行だけに限定ならorder by `金額`Limit 5 にすれば良いだけですけど・・・同順があるとどうすれば良いのかと思考停止状態です。尚、当方は、MySQLの勉強を始めたばかりにですので宜しくお願いいたします

    • ベストアンサー
    • MySQL
  • mysqlで年と月を別々のカラムに収納しています

    mysql5.1を利用してデータベースを作成しています。 テーブルに年と月を別々で収納しているのですが、 そのテーブルの中のデータから「今月を過ぎていなければ」という条件で抽出したいのですが、 SQLの書き方がわかりません。 私のSQLの基礎の基礎しか教えてもらっておらず、 あとは独学で、現在のレベルはようやく少しサブクエリを書き出した(学びだした)レベルです。 しかもwindows上のNavicat Lite(アプリ)上で書いてる状態です。 自分のイメージ的には下記のような感じなのですが、動きません。 どなたか教えていただけないでしょうか。 よろしくお願いします。 hoge_tblテーブルからBカラムが'hoge'かつ、 hoge_tblテーブル内のYEARカラムとMONTHカラムの値を今月と比較して、 「今月を過ぎていなければ」といった条件を付けたいと考えております。 select A from hoge_tbl where B = 'hoge' and (select date_format(now(),'%Y%m') as NOW) < (select date_format('(select YEAR,MONTH from hoge_tbl )’,'%Y%m') as END)

    • ベストアンサー
    • MySQL
  • ダイレクトインサートでテーブル作成時カラム長を指定

    oracle10g standard 下記のようなsqlでviewをtable化するとvarchar2のカラム長が固定で4000になります。 長さを指定することはできますか? create table test as select * from view;

  • MYSQLで全てのカラムから検索する。

    tbというテーブルのbangというカラムに4が含まれていれば表示というのは select * from tb where (bang) like '%4%' ; という形になりますが、このtbテーブルにさらにname,tukiというカラムがあったとして カラムに関係なくレコードのどこかに4が入っていれば抽出するというSQL文が書きたいです。 select * from tb where bang like '%4%' or name like '%4%' or tuki like '%4%' ; と書くことで何とか今まではやってきたのですが、カラム数が増えてきてしまったので、ものすごく長いSQL文なってしまいました。 もう少しスマートにする方法はありませんか?

    • ベストアンサー
    • MySQL
  • 同じテーブルからviewを作成しようとすると「ORA-00942: 表またはビューが存在しません。」というメッセージが出ます。

    viewを作成しようとしています。 asの後ろのselect文でひとつのテーブルを二度使って、 viewの列を二つ作りたいのですが、 「「ORA-00942: 表またはビューが存在しません。」」というメッセージが出てしまいます。 どういうことでしょうか。 具体的には下記のようなことです。 create or replace view tmp (a1,a2,b1,b2) as select abc.a1 as a1, abc.a2 as a2, abc.a1 as b1, abc.a2 as b2 from ABCtble abc よろしくお願いします。

  • 複数の副問合わせにて、一つだけデータがない場合の対処法は?

    テーブルの各区分に応じて、数量を個々に集計するSQLを作成しております。 そして以下のようなSQLを作りました。 SELECT TBLA.SURYO_1 ,TBLB.SURYO_2 , TBLC.SURYO_3 ,TBLD.SURYO_4 FROM (SELECT SUM(SURYO) AS SURYO_1 FROM TEST_TABLE WHERE TEST_KUBUN = '1' GROUP BY SURYO) TBLA, (SELECT SUM(SURYO) AS SURYO_2 FROM TEST_TABLE WHERE TEST_KUBUN = '2' GROUP BY SURYO) TBLB, (SELECT SUM(SURYO) AS SURYO_3 FROM TEST_TABLE WHERE TEST_KUBUN = '3' GROUP BY SURYO) TBLC, (SELECT SUM(SURYO) AS SURYO_4 FROM TEST_TABLE WHERE TEST_KUBUN = '4' GROUP BY SURYO) TBLD しかし、この方法ですと、区分'1','2','4'はデータがあるのに対して、区分'3'は データがないことにより、SQLを実行すると、対象データがないという結果となります。 当然個別にSQLを実行すればよいですが、速度的に4回もSQLを実行するのは効率悪いので、 出来れば一回で行いたいのですけど、区分'3'がデータがなくても、他の3つの区分のデータ を取得する方法はありますでしょうか? よろしくお願いします。

  • 「column "A" does not exist」というエラーが出て、ビューを作成することができません。

    「column "A" does not exist」というエラーが出て、ビューを作成することができません。 postgreSQL(8.2)&pgAdmin(1.6.3)で以下のようなビューを作成しようとしたところ、「column "A" does not exist」というエラーが出てしまい、作成することができません。 試しにMS ACCESSで全く同じSQL文を発行してみたのですが、ちゃんとクエリが作成でき、以下の図のように問い合わせ結果を閲覧することもできました。PostgreSQLでも作成できる方法があればご教示いただけないでしょうか。 CREATE VIEW v_test AS SELECT 1 AS A, A + 3 AS B; +----+ | A | B | +----+ | 1 | 4 | +----+ 上図のように1という数値を格納する列「A」と、その列の値に3を足した数値を格納する列「B」で構成されるビューを作成できればいいのですが、どうしてもできません(実際はもっと複雑な内容なのですが、要は、直前に定義した列(A)の値を参照する列(B)を作成することができないのです)。 そもそもPostgreSQLではできないものなのでしょうか。それとも初歩的な何かが抜けているのでしょうか。 該当するような参考文献が見つからないため質問させていただきました。 どうかご教示いただけないでしょうか。