- 締切済み
- すぐに回答を!
まだSQL初心者なので、よくわかっていないようです。
まだSQL初心者なので、よくわかっていないようです。 Viewの作り方がうまくいきません。 各テーブルの数値(PLAYCNT)の合計数を出力する VIEWを作成したいだけなのですが。。 これ↓を実行すると、mysqladminがフリーズしたようになって レコード数に~02(2は乗数) という変な数字が入ってしまいます。 これはいったいどうしてなのか分からず困っています。 CREATE VIEW ALLPLAY_TBL AS SELECT SUM(A.PLAYCNT) NORMAL_CNT, SUM(B.PLAYCNT) HARD_CNT, SUM(C.PLAYCNT) SPECIAL_CNT, SUM(D.PLAYCNT) MANIAC_CNT FROM NORMAL_TBL A, HARD_TBL B, SPECIAL_TBL C, MANIAC_TBL D
- KOGANESAKI
- お礼率87% (7/8)
- MySQL
- 回答数5
- ありがとう数18
- みんなの回答 (5)
- 専門家の回答
みんなの回答
- chukenkenkou
- ベストアンサー率43% (833/1926)
MySQLのバージョンを、最低でもMySQL 5.0、MySQL 5.1レベルまでは明記するようにしてください。また、機能によっては、MySQL 5.1.xxといったマイナーチェンジででも仕様変更されているケースもありますので、環境を具体的に提示するようにしてください。 また、単に「エラーになる」といったことでなく、具体的なメッセージなどを提示してください。それが、他人が検証する上で、大きな手がかりになります。 「FROM句でサブクエリを書けない」という制限は、私が使用しているMySQL 5.1.36でも残っています。 <方法1>ダミーの表を使いSELECT句で集計 他の方が提示されているORACLEでいうDUALは、MySQLは未実装です。しかし、MySQLでは「FROM 表名」自体を書かない構文があります。 DROP VIEW IF EXISTS ALLPLAY_TBL; -- "FROM tablename"構文自体を省略 CREATE VIEW ALLPLAY_TBL AS SELECT (SELECT SUM(PLAYCNT) FROM NORMAL_TBL) AS NORMAL_CNT ,(SELECT SUM(PLAYCNT) FROM HARD_TBL) AS HARD_CNT ,(SELECT SUM(PLAYCNT) FROM SPECIAL_TBL) AS SPECIAL_CNT ,(SELECT SUM(PLAYCNT) FROM MANIAC_TBL) AS MANIAC_CNT ; SELECT * FROM ALLPLAY_TBL; <方法2>UNIONで4表を1表のように扱う。集計はビュー操作時に行う 現在の表の構成では、4表を1表のように操作するケースがいろいろあるでしょう。 DROP VIEW IF EXISTS ALLPLAY_TBL; -- "UNIONで4表を1表のように操作 CREATE VIEW ALLPLAY_TBL AS SELECT PLAYCNT AS NORMAL_CNT,0 AS HARD_CNT,0 AS SPECIAL_CNT,0 AS MANIAC_CNT FROM NORMAL_TBL UNION ALL SELECT 0 AS NORMAL_CNT,PLAYCNT AS HARD_CNT,0 AS SPECIAL_CNT,0 AS MANIAC_CNT FROM HARD_TBL UNION ALL SELECT 0 AS NORMAL_CNT,0 AS HARD_CNT,PLAYCNT AS SPECIAL_CNT,0 AS MANIAC_CNT FROM SPECIAL_TBL UNION ALL SELECT 0 AS NORMAL_CNT,0 AS HARD_CNT,0 AS SPECIAL_CNT,PLAYCNT AS MANIAC_CNT FROM MANIAC_TBL ; -- 集計はビュー操作で SELECT SUM(NORMAL_CNT),SUM(HARD_CNT),SUM(SPECIAL_CNT),SUM(MANIAC_CNT) FROM ALLPLAY_TBL; 上記の例では、全体のPLAYCNTのみ集計していますが、これにプレイヤーを識別するIDなどもSELECT句で選択するようにすれば、プレイヤー毎の集計など、いろいろな操作が可能になります。
- mako_sea
- ベストアンサー率47% (62/130)
出力が列から行に変わってしまいますが、 ユニオンしてみるのはいかがでしょうか。 CREATE VIEW ALLPLAY_TBL AS SELECT SUM(A.PLAYCNT) NORMAL_CNT FROM NORMAL_TBL A union all SELECT SUM(B.PLAYCNT) HARD_CNT FROM HARD_TBL B union all SELECT SUM(C.PLAYCNT) SPECIAL_CNT FROM SPECIAL_TBL C union all SELECT SUM(D.PLAYCNT) MANIAC_CNT FROM MANIAC_TBL D

お礼
すみません、放置してしまっていました。 ご提示の方法がいいと思いました。 たいへんありがとうございます。
- enjoyhotlife
- ベストアンサー率25% (1/4)
結合がいらなかったんですね きちんと質問を読んでいませんでした この副問い合わせならどうでしょうか select (select sum(PLAYCNT) sm from NORMAL_TBL) as NORMAL_CNT, (select sum(PLAYCNT) sm from HARD_TBL) as HARD_CNT, (select sum(PLAYCNT) sm from SPECIAL_TBL) as HARD_CNT, (select sum(PLAYCNT) sm from MANIAC_TBL) as MANIAC_CNT from dual 私はオラクルを使用しているためasなど必要なければ削除してください なおdualはダミーテーブルです MySQLはバージョン 4.1.0 以降が対応しているようです

お礼
ありがとうございます。 しかし!やっぱりだめでした。 エラーも、結果も出ずという動きをしました。 もう少し色々と調べてみます。
- mako_sea
- ベストアンサー率47% (62/130)
たぶんPLAYCNTの値を合計した副照会をしておけば 大丈夫だと思うのですが。 以下で改善されるように思います。 CREATE VIEW ALLPLAY_TBL AS SELECT A.CNT AS A_CNT, B.CNT AS B_CNT, C.CNT AS C_CNT, D.CNT AS D_CNT FROM (SELECT SUM(PLAYCNT) AS CNT FROM NORMAL_TBL ) A , (SELECT SUM(PLAYCNT) AS CNT FROM HARD_TBL ) B , (SELECT SUM(PLAYCNT) AS CNT FROM SPECIAL_TBL ) C (SELECT SUM(PLAYCNT) AS CNT FROM MANIAC_TBL ) D ;

お礼
ありがとうございます。 しかしながら ビューの定義のSELECT文のFROM句では サブクエリは使えません。でエラーとなりました。 MySQLのビューの制限事項なのかなぁと思われます。 もう少し基本からやりなおしてみます。
- enjoyhotlife
- ベストアンサー率25% (1/4)
まずViewを作成するというよりSQLの基本を勉強したほうがいいでしょう ここに4つのテーブルがありますが 結合されていません そのためフリーズしてしまうんです 結合していない場合は、全あたりの結果がでてきますのでたぶんdbの限界か何かで結果が^で表示されるのでしょう まずは where a.[項目名] = b.[項目名] and a.[項目名]=c.[項目名] and a.[項目名]=d.[項目名] といったような内部結合または外部結合を作成して下さい このSQLの結果が自分が欲しいものであれば CreateをつけてViewを作成すればいいですよ

お礼
ありがとうございます。 4つの表にリレーションがあるわけではなく 各レコードに記録されたある列の合計数 取得したいだけなのですが AのPlayCNTの合計 | Bの…合計 | Cの…合計 |Dの…合計 色々結合ためしてみてもやっぱりうまくいかず もう少し調べてみます。
関連するQ&A
- mysqlのsql文について質問です
tbl_aとtbl_bから、tbl_cを作りたいのですが どのようなsql文を書けば良いでしょうか? アドバイス頂けると嬉しいです。よろしくお願い致します。 テーブル:tbl_a ----------------- code1,code2,name ----------------- 001,a,あ 002,a,あ 003,a,あ 004,a,あ 005,b,い 006,b,い 007,b,い 008,c,う 009,c,う 010,c,う 011,c,う 012,d,え 013,d,え 014,d,え テーブル:tbl_b ----------------- code1,point ----------------- 003,10 004,2 008,10 009,5 011,20 テーブル:tbl_c ----------------- code2,name,point ----------------- a,あ,2 b,い, c,う,5 d,え,
- ベストアンサー
- MySQL
- ACCESS2000 SQL 最大レコード数
こんにちは。 [TBL] キーは A B DD Cです。 A B DD C E 1 2 21 7 ..... 1 2 21 8 ..... 1 2 22 3 ..... 1 2 22 8 ..... 1 2 22 9 ..... 3 1 2 1 ..... 3 3 4 2 ..... から、A=1 B=2の数の最大レコード数をカウントしたいです。 但し、DDは同じ数なことが条件です。 上でいうと、D=22のものが3つあり、D=21のものが2つあるので、最大は3ということで、3を取得したいです。 select count(*) FROM TBL where A=1 AND B=2 GROUP BY C に近い感じだとはおもうのですが。 よろしくお願い致します。
- ベストアンサー
- その他(プログラミング・開発)
- 副問い合わせで複数の列を返す
こんにちは、Makotoと申します。 SQLの副問い合わせで質問があるのですが、 現在のSQLは CREATE OR REPLACE VIEW VIWTEST AS SELECT KOMOKU1, KOMOKU2 (SELECT SUM(KOMOKU3) FROM TBL WHERE A = 1 (SELECT SUM(KOMOKU4) FROM TBL WHERE A = 1 (SELECT SUM(KOMOKU5) FROM TBL WHERE A = 1 FROM M_TBL; という感じのSQLなのですが、副問い合わせの所 が見ているテーブルも条件も一緒なので1つにまとめたいのですが、うまくいきません。CURSORという関数があったのですが、VIEWでは使用できませんでした。なにかよい方法はないでしょうか? 開発環境は oracle 9i(AIX) pro*C/C++ でおこなっています。
- ベストアンサー
- Oracle
- 3テーブルより抽出のSQL文
3テーブルよりを以下の条件で1つのSELECT文で抽出したいのですが可能でしょうか? ・C_TBLのDATEが2007のデータ〔SUBSTR(DATE,1,4)='2007'を使用?〕 ・A_TBLのCORPがcorp1のデータ(あいまい検索) ・CORP(昇順)、DATE(降順)、ITEM(昇順)でソート ・表示カラムは、CORP・DATE・ITEM・SURYO・TANKAです <<A_TBL>> <<B_TBL>> <<C_TBL>> A CORP B A ITEM TANKA C A B DATE SURYO a01 corp11 b01 a02 item03 10 c01 a03 b06 2007-11-01 100 a02 corp13 b02 a03 item01 20 c02 a01 b03 2007-12-01 200 a03 corp11 b03 a01 item03 10 c03 a05 b04 2007-11-01 100 a04 corp05 b04 a05 item02 30 c04 a01 b05 2007-11-01 300 a05 corp13 b05 a01 item02 30 c05 a03 b06 2007-12-01 200 b06 a03 item03 20 c06 a01 b05 2007-11-02 100 b07 a01 item01 10 c07 a03 b02 2007-11-01 500 また、以下の条件で集計を1つのSELECT文で行えますか? 現在は、C_TBLとB_TBLで集計抽出し、A_TBLの対象データを抽出し、2つの配列より・・・ というロジックを組んでいます。 ・C_TBLのDATEが2007のデータ〔SUBSTR(DATE,1,4)='2007'を使用?〕 ・A_TBLのCORPがcorp1のデータ(あいまい検索) ・CORP(昇順)、DATE(降順)でソート ※DATEは年月のみです ・CORP、DATE(年月)毎で金額を集計〔SUM(C_TBL.SURYO*B_TBL.TANKA) AS KINGAKU〕 ・表示カラムは、CORP・DATE・金額です 宜しくお願い致します。
- ベストアンサー
- MySQL
- 行ごとに連番を付けたい
例えば下記のようなデータがあったときに "Name","sub","cnt" A,a,100 B,a,200 A,b,150 A,c,110 B,b,250 ビューで WHERE (sub >= b) で A,b,150 B,b,250 を取得するのは簡単なのですが 1,A,b,150 2,B,b,250 と取得した行に対して連番を付けていきたいのですが できないでしょうか? CREATE TABLE #t ( No int IDENTITY(1,1), Name char(200), sub char(200), cnt int ) INSERT INTO #t( Name , sub , cnt ) SELECT ・・・・・・・・ とストアドではできるのですが、 ビューでできたらやりたいのです。 お願いいたします。
- 締切済み
- SQL Server
- 3テーブルの外部結合
3テーブルよりを以下の条件で1つのSELECT文で集計したいのですが可能でしょうか? ・A_TBLのA単位でB_TBLのNYUKAとC_TBLのSYUKAを集計 <<A_TBL>> <<B_TBL>> <<C_TBL>> A STOCK B A NYUKA C A SYUKA a01 100 b01 a02 10 c01 a03 10 a02 200 b02 a01 20 c02 a01 20 a03 300 b03 a01 10 c03 a05 10 a04 400 b04 a03 30 c04 a01 30 a05 500 b05 a05 30 c05 a03 20 b06 a02 20 c06 a01 10 b07 a01 10 c07 a03 50 外部結合 SELECT a.A,a.STOCK,SUM(b.NYUKA) AS SUM_NYUKA,SUM(c.SYUKA) AS SUM_SYUKA FROM A_TBL AS a". LEFT OUTER JOIN B_TBL AS b ON a.A=b.A LEFT OUTER JOIN C_TBL AS c ON a.A=c.A". GROUP BY a.A でうまくいきません。3つ以上のテーブルの外部結合の記述が間違っているのはわかるのですが、 どのように記述すればよいか、ネットで検索してもわかりませんでした。 宜しくお願い致します。
- 締切済み
- MySQL
- シンプルなSQLの書き方がわかりません。
以下のSQLをシンプルに一つにしたいのですが、どのように書いたらよろしいでしょうか? どうぞご返答頂けますようお願い申し上げます。 --test1_tblの抽出 select a1 as a1, b1 as b1 from a_tbl where c=1 --test2_tblの抽出 select a1 as a1, e1 as e1 from b_tbl where rowid in (select min(rowid) from ee group by a1) and a1 is not null and a1 !=' ' order by a1 --test1_tblとtest2tblの結合 select t0.a1 as a1, t0.b1 as b1, t1.e1 as e1 FROM test1_tbl t0, test2_tbl t1 WHERE (t0.a1 = t1.a1)
- ベストアンサー
- Oracle
- SQLで後方の文字列を置換する方法
表現方法が稚拙で申しわけありませんが。 あるテーブルに存在する値を、他のテーブルにある値と前方一致で結合したいと思います。 (1)TBL_A(項目名はA) (a) 10230 (b) 11350 (c) 30040 (2)TBL_B(項目名はB) (d) 10200 (e) 11000 (f) 30000 (形式はVARCHAR2,値は数字のみで長さは固定) 上記のようなデータで、TBL_Bに関しては後ろの「0」は無視して 前方一致で結合したいのです。 つまり、(a)と(d)、(b)と(e)、(c)と(f)が結合されるようにしたいのです。 SQL文で表現すると、次のようになります。 TBL_A.A LIKE '102%' OR TBL_A.A LIKE '11%' OR TBL_A.A LIKE '3%' これを次のようなSQLで記述してみました。 TBL_A.A LIKE SUBSTR(TBL_B.B,1,INSTR(TRANSLATE(TBL_B.B,'123456789','XXXXXXXX'),'X',-1,1)) || '%' 以上のSQLで問題ないと思いますが、もっとシンプルな方法があればお教え願います。 DBはORACLE9iです。
- ベストアンサー
- Oracle
- sqlについて
下に書いたsqlのコードの内容(どういう処理でどういう結果になるのか)が知りたいです。 どなたかわかる方教えてください。 select b.ym, b.no, isnull(e.sumcnt,0)as val, null as bunsi, null as bunbo from (select distinct ym,no from Table_A)b inner join (select ym from Table_B where cd=1)d on b.ym=d.ym left outer join (select b1.ym,b1.no,sum(c1.cnt)as sumcnt from Table_A b1 inner join (select ym from Table_B where cd=1)d1 on b1.ym=d1.ym inner join Table_C c1 on b1.ym=c1.ym group by b1.ym,b1no)e on b.ym=e.ym and b.no=e.no
- 締切済み
- その他(プログラミング・開発)
お礼
とても勉強になります。 FROM句を省略できるんですね。。驚きです。 サンプルコードまで記載頂き感謝この上ありません。 じっくりと確認させていただきます。 ちなみに、コピペでバッチリOKでした! ありがとうございます。 # アプリの方も無事完成し、本日リリースできました。 # mixiアプリでフリーセルのアプリを作っていたので # こういうカラム名になっていました。