ベストアンサー ※ ChatGPTを利用し、要約された質問です(原文:MySQLで縦の計算について) MySQLで縦の計算について 2008/06/16 17:21 このQ&Aのポイント MySQLでレコードの特定のカラムの縦の合計を出す方法は無いのでしょうか?total1とtotal2を縦に計算した合計を取得する方法をご教授いただけませんか?MySQLではtotal1とtotal2を縦に合計することはできないのでしょうか? MySQLで縦の計算について いつも大変お世話になっております。 MySQLでレコードの特定のカラムの縦の合計を出す方法は無いのでしょうか? 例えば下記のようなテーブルがあるとします。 hoge_total |id|total1|total2| |2|100|600| |3|200|700| |4|300|800| |5|400|900| |6|500|1000| 各レコードに対して横の合計を出すなら select *,total1 + total2 as total from hoge_total hoge_total |id|total1|total2|total| |2|100|600|700| |3|200|700|900| |4|300|800|1100| |5|400|900|1300| |6|500|1000|1500| といった感じで簡単に出せますが、total1、total2を縦に計算した合計が出せないのでしょうか? 結果としては hoge_total |id|total1|total2|total| |2|100|600|2100| |3|200|700|2100| |4|300|800|2100| |5|400|900|2100| |6|500|1000|2100| ※total1を縦に合計した値をtotalとして取り出す こんな感じにしたいんですが、MySQLでは出来ないのでしょうか? 何卒、ご教授の程、宜しくお願い致します。 質問の原文を閉じる 質問の原文を表示する みんなの回答 (2) 専門家の回答 質問者が選んだベストアンサー ベストアンサー yambejp ベストアンサー率51% (3827/7415) 2008/06/16 22:36 回答No.2 4.1ならサブクエリーがつかえますね SELECT id, total1, total2, total FROM hoge_total, ( SELECT SUM( total1 ) AS total FROM hoge_total ) AS hoge_total2 よくみればわかりますが、すごく意味がないことをしています。 このようなSQLは絶対にやらないことをお勧めします。 できることとやっていいことは違います。 (ちなみにtotal1の合計は2100ではなく1500ですね?) 質問者 お礼 2008/06/17 00:39 ありがとうございます! おっしゃるとおり、意味がないだけではなく、サーバに無意味な負荷をかけるだけにしか見えません。 このままでは使用しませんので、大丈夫です。 助かりました! 広告を見て全文表示する ログインすると、全ての回答が全文表示されます。 通報する ありがとう 0 その他の回答 (1) yambejp ベストアンサー率51% (3827/7415) 2008/06/16 17:36 回答No.1 (1)基本的にやる意味がありません・・・ 毎行おなじトータルがでてくるのはオーバーヘッドが大きく意味不明。 (2)どうしてもやりたいならできます。 MySQLのバージョンによってやりかたが違います。 バージョンを書いた方がよいでしょう 質問者 補足 2008/06/16 21:35 すみません。バージョンを明記しておりませんでした。 MySQLのバージョンは4.1.15です。 お教え頂けると大変助かります。何卒、宜しくお願い致します。 広告を見て全文表示する ログインすると、全ての回答が全文表示されます。 通報する ありがとう 0 カテゴリ [技術者向] コンピューターデータベースMySQL 関連するQ&A 複数のグループ化でのSUM関数について お世話になります。宜しくお願い致します。 MySQL4.1.15を使っております。 下記のようなテーブルがあるとします。 hoge_table | id1 | id2 | total | | 1 | 10 | 100 | | 1 | 10 | 100 | | 1 | 10 | 100 | | 2 | 20 | 200 | | 2 | 20 | 200 | | 3 | 20 | 300 | | 4 | 20 | 400 | | 4 | 20 | 400 | | 4 | 20 | 400 | | 4 | 20 | 400 | | 5 | 20 | 500 | | 5 | 20 | 500 | | 6 | 30 | 600 | | 7 | 30 | 700 | | 7 | 30 | 700 | | 7 | 30 | 700 | | 7 | 30 | 700 | | 8 | 30 | 800 | | 9 | 30 | 900 | | 9 | 30 | 900 | | 9 | 30 | 900 | | 9 | 30 | 900 | | 9 | 30 | 900 | このテーブルに対して、下記のような条件でTOTALを出したいのです。 条件: id2でグループ化させた上、同じid1のtotalから重複を削除した合計 id2をグループ化させると、10、20、30の3レコードにまとまり、sum関数を使ってtotalの合計を出すと SQL = select id1,id2,sum(total) as total from hoge_table | id1 | id2 | total | | 1 | 10 | 300 | | 5 | 20 | 3300 | | 9 | 30 | 8700 | という結果になるかと思います。 ここで、sum関数で合計させるtotalを、さらにid1で重複を削除したtotalのみを集計したいのです。 つまり、 | id1 | id2 | total | | 1 | 10 | 100 | | 5 | 20 | 1400 | | 9 | 30 | 3000 | という結果を出したいのですが、どうしてもこの結果が得られません。 サブクエリでid1をグループ化させたtotalをsum関数で集計してもやはりだめでした。 何か良い方法は無いのでしょうか? 何卒、ご教授の程、宜しくお願い致します。 mysqlで横方向ではなく縦方向の条件抽出は… id hoge num 01 AAA 0 01 BBB 1 02 AAA 1 03 BBB 0 というテーブルがあったとします。 select id from table where hoge='AAA' and num=0 のような条件で検索するのは普通ですが、 カラムではなくレコード単位で見て hogeの値がAAAとBBBの両方である場合のデータとして「01」というidのみを抽出する方法はないものでしょうか。 よろしくお願いします。 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になってしまいました。 何か良い方法はございませんでしょうか? ネットワークエンジニアとは?技術職の未来を考える OKWAVE コラム MySQLでテーブル一致条件に正規表現は使用可能? ・MySQLで一致条件に正規表現を使用することは出来ますか? ・もし出来るとすればどのようにすれば良いでしょうか? ■やりたいこと ・aテーブルのurlカラム内容が「/color/★★」だったら「/color/」以下の★★を抽出して、bテーブルのidと一致したレコードを抽出したい ・aテーブルの★★と、bテーブルのidカラムが一致しているレコードが欲しい ・aテーブルのurlカラムには「/color/58」「/color/26」「/hoge/■■」などが入っています SELECT * FROM a LEFT JOIN a.url = b.id REGEXP '^(/color)'? where a.★★ = b.id MySQL: 複数テーブルのcount 複数テーブルの総行数(count値)を取得したいのですが、下記だとテーブルA,B,Cの結果が バラバラに出力されてしまいます。 【入力条件】 mysql> select COUNT(*) AS 列ID from テーブルA union all select COUNT(*) AS 列ID from テーブルB union all select COUNT(*) AS 列ID from テーブルC; 【出力結果】 +-----+ | 列_ID | +-----+ | 1 | ←テーブルAの合計:行数 | 2 | ←テーブルBの合計:行数 | 3 | ←テーブルCの合計:行数 +-----+ 総行数:6を一発で取得するには、どのようにしたらよろしいのでしょうか? 大変恐縮ですが、ご教授よろしくお願いいたいます。 <<MySQLのverは5,5です。 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) 複数テーブルからLIKE検索を行いたいのですが、う 複数テーブルからLIKE検索を行いたいのですが、うまくいかないので教えてください ■やりたいこと ・一つのキーワードで、MAINテーブル「hoge」カラムと、SUBテーブル「hoge」カラムを検索して、該当したレコードを表示したい ■テーブル構成 ・MAIN … 「id」「main1」「hoge」… ・SUB… 「sub_id」「main_id」「sub1」「hoge」… ・1つの「id」に対して、対応する「sub_id」が複数(「id」1は一つだけ。対応する「sub_id」1は複数あります) ■試したこと1 SELECT a.* , r.* FROM main a LEFT JOIN sub r ON a.id = r.main_id WHERE ( a.hoge LIKE '%キーワード%' OR r.hoge LIKE '%キーワード%' ) とやると、2件ヒットするはずなのに、1レコードしか取得できません(1レコードに「hoge」カラムが2つ入ります) ■試したこと2 SELECT a.* , r.hoge as rhoge FROM main a LEFT JOIN sub r ON a.id = r.main_id WHERE ( a.hoge LIKE '%キーワード%' OR r.hoge LIKE '%キーワード%' ) とやると、2件ヒットするはずなのに、1レコードしか取得できません(1レコードに「hoge」と「rhoge」カラムになります) ■試したこと3 FROMで2箇所指定するのかと思ったのですが、 SELECT a.* , r.* FROM (main a,sub r) LEFT JOIN r ON a.id = r.main_id WHERE ( a.hoge LIKE '%キーワード%' OR r.hoge LIKE '%キーワード%' ) 結果は、#1066 - Not unique table/alias: 'r'になります ■試したこと4 LEFT JOINがいらないのかと思い、削除したら、2件ヒットするはずなのに、たくさんヒットしてしまいます ■質問 欲しいのは、キーワード検索した際、該当カラムにヒットした数だけのレコードなのですが、どうすれば良いのでしょうか? ■例 ・東京で検索 ・MAINテーブル「hoge」カラム(2レコード)で2ヒット ・SUBテーブル「hoge」カラム(3レコード)で3ヒット ・ヒットした該当5レコードを取得したい count関数の値をwhere句で使用する方法について 宜しくお願い致します。 例えば、下記の様にデータを検索します。 select column1,count(column2) as column2_num from hoge_table group by column2_num すると、検索結果にはcolumn1のそのままの値と、column2の合計数が表示されると思います。 このcolumn2の合計数に対してwhere句で絞込みを行う方法はありませんか? asで定義した値をそのままwhere句で使用できないとの事なので、 select column1,count(column2) as column2_num from hoge_table where count(column2) = '1' group by column2_num とやってみたんですが、検索出来ませんでした。 ご存知の方、ご教授の程、宜しくお願いいたします。 MySQLでの集計 いつもお世話になっております。MySQLを利用しておりまして質問です。 同じ構成のテーブルが5つあり、選択されたテーブルを集計するSQLを作成しています。 カラムを簡単に構成を書くと ID、名前、ステータス1、ステータス2 のような形です。 テーブル1、2、3が選択された場合 テーブル1と2でIDの重複のない一覧を作成し、IDが被っていた場合はステータスをそれぞれ大きいほうを保持するようにします。 そして次にテーブル1、2を合わせたテーブルとテーブル3で同じように集計をしたいのですが、ここがうまく出来ません。 実際の環境ではなく簡素化したものなのでおかしな点があるかもしれませんがこのようになっています。 SELECT TTT1.id,TTT1.名前,TTT1.st1,TTT1.st2 FROM( SELECT id,名前,ステータス1 as st1,ステータス2 as st2 FROM( SELECT * FROM テーブル1 T1 WHERE T1.id NOT IN(SELECT T2.id FROM テーブル2 T2) UNION All SELECT * FROM テーブル2 T2 WHERE T2.id NOT IN(SELECT T1.id FROM テーブル T1) ) as TT1 UNION SELECT id,名前,st1,st2 FROM( SELECT T1.id,T1.名前, (CASE T1.ステータス1 or T2.ステータス1 WHEN "2" THEN "2" WHEN "1" THEN "1" WHEN "0" THEN "0" ELSE null END) as st1, (CASE T1.ステータス2 or T2.ステータス2 WHEN "2" THEN "2" WHEN "1" THEN "1" WHEN "0" THEN "0" ELSE null END) as st2, FROM テーブル1 T1,テーブル2 T2 WHERE T1.id = T2.id AND NOT(T1.st1 IS null AND T1.st2 IS null AND T2.st1 IS null AND T2.st2 IS null) ) as TT2 )as TTT1 /* UNION ALL SELECT id,名前,st1,st2 FROM (TTT1とテーブル3を比較したもの)as TTT2 */ /**/で囲ったところでTTT1が呼び出せれば、テーブル1のところをTTT1にし、テーブル2をテーブル3にすれば出来ると思うのですが、そういうことは無理なのでしょうか? また集計するテーブルの数が不特定なので一つずつ集計をする形を取りましたが、 もっとこういう風にやればいいと言う方法はございますでしょうか? よろしくお願いいたします。 最後のデータを含むレコード1行 MYSQL お世話になります。 最後の日にちを含むレコード全ての抽出方法がどうしてもわかりません。 id name date amount 1 AA 3/1 5 2 BB 3/1 5 3 CC 3/1 5 4 AA 3/2 7 5 BB 3/2 4 6 AA 3/3 1 これを、select * from テーブル group by name とすると、 id name date amount 1 AA 3/1 5 2 BB 3/1 5 3 CC 3/1 5 select id, name, max(date),amount from テーブル group by name とすると、 id name date amount 1 AA 3/3 5 2 BB 3/2 5 3 CC 3/1 5 望んでいる結果はこうです。最後のdateを含むレコード全てです。 id name date amount 3 CC 3/1 5 5 BB 3/2 4 6 AA 3/3 1 select * from テーブル as a where a.date=(select max(b.date) From テーブル as b where a.id=b.id); このようにしましたが、データの数が膨大なのですごく時間がかかってしまいます。 他、シンプルな方法はないでしょうか。 よろしくお願いします。 MYSQL バージョン5.0.45 Mysql サブクエリの使い方 table_A ---+------ id | count ---+------ 1 | 5 ---+------ 2 | 6 ---+------ 3 | 7 ---+------ table_B ---+----- id | sub_count ---+----- 1 | 2 ---+------ 2 | 2 ---+------ 3 | 5 ---+------ 1 | 3 ---+------ 2 | 4 ---+------ このようなテーブルで table_Aのcountと、table_Bのidでまとめたsub_countの合計が 一致しないidだけを抽出するために、 SELECT table_A.id FROM (SELECT sum(table_B.sub_count) FROM table_B GROUP BY table_B.id) AS B, table_A, table_B WHERE table_A.id = table_B.id AND table_A.count != sum(table_B.sub_cout) と書いてみましたが、うまくいきません。 ERROR 1111 (HY000): Invalid use of group function 何が悪いのでしょうか? mysqlも投稿も初心者です。 よろしくお願いします。 MySQLで合計と小計の計算方法を教えてください パート2 MySQLで合計と小計の計算方法を教えてください パート2 name | kamoku | tensu テーブル:testdb --------------------------- 001 英語 95 001 国語 90 001 理科 75 001 社会 73 001 算数 62 002 英語 93 002 国語 87 002 理科 78 002 社会 71 002 算数 68 -------------------------------- 30人位いるのですが、やりたい事は以下になります。 基準点数(好きな点数を入力)$kijyunt sql = select sum(tensu) as stensu, sum(tensu)-(select count(*) * $kijyun from testdb) as hensa from testdb where tensu >= 70 全科目70点以上の点数を合計し、全体のレコード×70の点数を引き算したいのです。 しかしながらうまく表示しません。どこが悪いかご指摘お願いします。 AIは使う人の年齢や市場にも影響する?人工知能の可能性 OKWAVE コラム SELECT出来るのにDELETE出来ないのはなぜ MySQLで下記SELECTレコードを削除したいと思い、 DELETEへ変えたら文法エラーになります。 SELECT * FROM `piyo` AS a LEFT JOIN `hoge` AS c ON a.`hoge_id` = c.`hoge_id` WHERE c.`x_id` =13 DELETE * FROM `piyo` AS a LEFT JOIN `hoge` AS c ON a.`hoge_id` = c.`hoge_id` WHERE c.`x_id` =13 どう書けば良いでしょうか? MySQL条件分岐して自己結合とか出来るでしょうか IF もしくは CASE文(?)を利用して、FROM 箇所を変更することはできるでしょうか? ■やりたいこと ・「hoge_id」カラムが0だったら、普通に「redult」カラムからデータ取得 ・「hoge_id」カラムが0以外だったら、「hoge_id」」「id」カラムで自己結合したテーブル(ビュー?)から「result」カラムデータ取得 ひらがなの検索結果が正常ではない 初めての投稿です よろしくお願いします MySQLにてひらがなが入っているカラムでorder byしても予想に反します。文字コードが原因だとは思うのですが、MySQLの設定方法がよく分かっていません。ご指導、よろしくお願いします。 --- MySQLサーバーはLinux Windowsからターミナルにてテーブル作成、データ入力およびselectを実行 mysql> show columns from HOGE; +-----------+-------------+------+-----+ | Field | Type | Null | Key | +-----------+-------------+------+-----+ | id_c | int(11) | | PRI | | hoge_name | varchar(20) | YES | | +-----------+-------------+------+-----+ 2 rows in set (0.00 sec) mysql> select * from HOGE; +------+------------------+ | id_c | hoge_name | +------+------------------+ | 1 | あいうえお | | 2 | かきくけこ | | 7 | まみむめも | +------+------------------+ 11 rows in set (0.00 sec) mysql> select * from HOGE order by hoge_name; +------+------------------+ | id_c | hoge_name | +------+------------------+ | 7 | まみむめも | | 1 | あいうえお | | 2 | かきくけこ | +------+------------------+ 11 rows in set (0.00 sec) MySQLでLEFT JOIN MySQL4.0.26でテーブルの左外部結合がしたいです。 左テーブルAと 右テーブルBをWHERE句で抽出したもの を結合することはできないのでしょうか? 考えた以下の式ではエラーが出てしまいます。 SELECT * FROM A LEFT JOIN ( SELECT * B WHERE id = 1 ) AS B2 ON A.id = B2.id mysqlのselectについて mysqlのselectについて selectがおかしいです。 select * from hoge where a = 'あ'; とすると、 |"あ" |"hoge" | null | |"あ" |"hohi" | null | ... って感じで出力されるはずなんですが、 | |"hoge" | null | | |"hohi" | null | ... って感じで"あ"のとこが押しつぶされて出力されてしまいます。 何がどうなってるんでしょうか...? 文字コードはsjisで、あってるはずなんですがなんか動きません mysqlのmatch() against()で検索結果が取得できませ mysqlのmatch() against()で検索結果が取得できません。 select * from fulltexttable where match( a ) against( '+ほげ' in boolean mode ) で検索結果は0件ですが、 select * from fulltexttable where a like '%ほげ%' だと検索結果は取得できます。 aカラムにはフルテキストインデックスは貼ってあります。 mysqlのバージョンは5.0.77 hogeテーブルはMyISAM どなたか助けてください。 SQLで複数テーブルの変数を1つにまとめる方法 MySQL 5.5を使用しています。 以下のテーブルA、B(同じ構造でIDは重複しない)において A ID | ポイント 1 | 10 3 | 20 5 | 5 6 | 5 B ID | ポイント 2 | 20 4 | 20 7 | 5 select ID,hoge from A,B; とすると、 A.ID | B.ID | A.hoge | B.hoge 1 |. | 10 |. . | 2 |. | 20 3 |. | 20 |. . | 4 |. | 20 5 |. | 5 |. 6 |. | 5 |. . | 7 |. | 5 という結果が得られますが、これを ID2| foo 1 | 10 2 | 20 3 | 20 4 | 20 5 | 5 6 | 5 7 | 5 という形に同一の変数にまとめるにはどうすればいいでしょうか。 select A.ID as ID2, B.ID as ID2 from A,B; のようにasを使用して1つの変数を作成しようとしましたが、別の変数として 認識されていまいました。 行数の取得 mysql初心者です 行数を取得したいです 処理をすこしでも軽くしたいです このように書くとテーブルの中身は見に行かないらしいのですが SELECT COUNT(*) AS cnt FROM bbs WHEREをつけると中身を見に行きますか? SELECT COUNT(*) AS cnt FROM bbs WHERE sure_id=5 中身を見に行く場合、カラムを指定したほうが早いでしょうか? SELECT COUNT(id) AS cnt FROM bbs WHERE sure_id=5 よろしくお願いします 注目のQ&A 「You」や「I」が入った曲といえば? Part2 結婚について考えていない大学生の彼氏について 関東の方に聞きたいです 大阪万博について 駅の清涼飲料水自販機 不倫の慰謝料の請求について 新型コロナウイルスがもたらした功績について教えて 旧姓を使う理由。 回復メディアの保存方法 好きな人を諦める方法 小諸市(長野県)在住でスキーやスノボをする方の用具 カテゴリ [技術者向] コンピューター データベース SQL ServerOraclePostgreSQLMySQLNoSQLその他(データベース) カテゴリ一覧を見る OKWAVE コラム 突然のトラブル?プリンター・メール・LINE編 携帯料金を賢く見直す!格安SIMと端末選びのポイントは? 友達って必要?友情って何だろう 大震災時の現実とは?私たちができる備え 「結婚相談所は恥ずかしい」は時代遅れ!負け組の誤解と出会いの掴み方 あなたにピッタリな商品が見つかる! OKWAVE セレクト コスメ化粧品 化粧水・クレンジングなど 健康食品・サプリ コンブチャなど バス用品 入浴剤・アミノ酸シャンプーなど スマホアプリ マッチングアプリなど ヘアケア 白髪染めヘアカラーなど インターネット回線 プロバイダ、光回線など
お礼
ありがとうございます! おっしゃるとおり、意味がないだけではなく、サーバに無意味な負荷をかけるだけにしか見えません。 このままでは使用しませんので、大丈夫です。 助かりました!