• ベストアンサー

簡単なSQLを書くには?

あるテーブルに列が40~50個ほど存在しており、そのテーブルに置いて合計を求めたいと考えております。 通常の方法であれば、 SELECT SUM(a1), SUM(a2), SUM(a3),.... `table` WHERE b1="0" OREDER BY c1 と書くのですが、列が40個もSUM()を書き続けるのが面倒なので何か簡単に合計を求めるSQLをご存じありませんでしょうか?

  • MySQL
  • 回答数1
  • ありがとう数1

質問者が選んだベストアンサー

  • ベストアンサー
  • php504
  • ベストアンサー率42% (926/2160)
回答No.1

自分だったらPHPなどのスクリプトでSQL文を作成してやると思います。 $sql = "SELECT "; for ($i = 1; $i <= 40; $i++) { $sql .= "SUM(a" . $i . ")"; if ($i != 40) $sql .= ","; } $sql .= ' FROM `table` WHERE b1="0" ORDER BY c1'; $result = mysql_query($sql);

altemis
質問者

お礼

やはり、プログラム側で何とかするべきなんですね。 手を抜かずがんばりたいと思います。

関連するQ&A

  • SQL

    SQLの初心者です。 次のようなテーブルがあるとします。 項目:A , B , C , D このテーブル合計を求めたいのです。 条件は、 同一テーブルでB=10の時のAの合計とD=10の時のCの合計の合計です。 B=10の時のAの合計は「sql sum(A) from テーブル where B=10」となります。 D=10の時のCの合計は「sql sum(C) from テーブル where D=10」となります。 この2つの合計を求めたいのです。 宜しくお願いします。

    • ベストアンサー
    • MySQL
  • 重複レコードを高速で取得するSQL

    Access(mdb)から約2万件レコードのあるテーブルがあるとします。 列数は20ほど。 その中から、3つの列において重複しているレコードを取得したいのですが、 高速に取得する方法はありますでしょうか? (VB.NETで、重複レコードをユーザーに示す処理を作成したいのです) 以下のSQLを試したところ、1分以上時間がかかってしまいました。 ----------------------------- SELECT * FROM テーブルA table1 WHERE EXISTS ( SELECT * FROM テーブルA table2 WHERE table1.列A = table2.列A   table1.列B = table2.列B   table1.列C = table2.列C GROUP BY table2.列A HAVING COUNT(table2.列A) > 1 ) ----------------------------- アドバイスをお願いします。

  • SQL文「DISTINCT」の「ORDER BY」について

    SQL文「DISTINCT」の「ORDER BY」について教えて下さい。 A列をDISTINCTで重複行の排除をしています。 その後、B列でORDER BYをかけたいのですが、エラーが 出てしまいます。A列でのORDER BYは成功します。 何か良い方法があれば教えて下さい。 よろしくお願いします。 SQL="SELECT DISTINCT A列 from table " &_ "WHERE (table.C列='100') " &_ "ORDER BY (table.B列) ASC " ⇒エラー    "ORDER BY (table.A列) ASC " ⇒成功

  • 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

  • SQL HAVING句の使い方について

    以下のテーブルAとテーブルBを結合して結果テーブルを出力したいと考えています。 (テーブルA上のIDのカウントした数をテーブルBに結合して出力したい。) テーブルA ----------- CATE ID aaa 001 bbb 001 ccc 003 ddd 004 テーブルB ----------- ID NAME 001 101 002 102 003 103 004 104 結果テーブル ---------------------- ID NAME COUNT 001 101 2 002 102 0 003 103 1 004 104 1 そこで、 =================================== SELECT B.ID, B.NAME, COUNT(A.ID) FROM TABLE_A B, TABLE_B B GROUP BY B.ID, B.NAME, A.ID HAVING A.ID = B.ID =================================== とSQLを書いてみましたが、 002 102 0 のテーブルAにIDが存在していない列が結果として表示されませんでした。 WHERE句でいう「WHERE A.ID =* B.ID」のようなことを行いたいのですが、どのように行えばよいでしょうか? よろしくお願いいたします。

  • SQL初心者です。

    【Table1】 Col1 Col2 Aa A Ab A Ba B Bb B Ca C Ca D 【Table2】(Data1は固定) Data1 Data2 Aa A Ab B→A Ba C→B Bb A→B Ca B→C Ca C ※Col1に重複がある場合、重複結果の1行目のレコードをData2に入れる (今回の場合CをData2に入れる) Data1は固定で、Table1を使ってData2を上記の様に修正するSQLが書けなくて困っています。 Col1が重複してない場合の修正するSQLを書いてみましたが(合っているかはわかりませんが...)、 重複する場合のSQLも追加して最終的に1つのSQLで、すべて修正できるようにしたいです。 update Table2 T2  set Data2=  (select Col2 from Table1  where Col1=   (select Col1 from Table1 T1   where T2.Data1=T1.Col1   group by T1.Col1   having count(T1.Col1)=1  ) ) わかりにくい部分もあると思いますが、ご教授お願いします。

  • SQL得意な方

    仕事で困っています、 なにとぞお力添えを。 テーブル1から、TOP50 でaとbを表示させたいのです。 で、その際の条件として、 開始するレコードも指定したいのです。 下記SQLの[○]の部分に50が入っていたら、 51~100件を表示する、と、いうような。 SELECT TOP 50 a,b FROM テーブル1 WHERE c='1' AND a >= '' AND a NOT IN ( SELECT TOP 〇 a FROM テーブル1) ORDER BY a で、順調だったのですが、WHERE条件が なんだか怪しいらしく、 a >= ''の時だけはきちんと動くのですが、 ANDでc='1'をつけた所、普通に全件表示されてしまいます。 [ちゃんと51件目から100件目を表示するSQL] SELECT TOP 50 a,b FROM テーブル1 WHERE a >= '' AND a NOT IN ( SELECT TOP 〇 a FROM テーブル1) ORDER BY a [何故か全件表示になるSQL] SELECT TOP 50 a,b FROM テーブル1 WHERE c='1' AND a >= '' AND a NOT IN ( SELECT TOP 〇 a FROM テーブル1) ORDER BY a ※[何故かNOT IN (~)の部分がまったく働いていない] どうしてなのでしょう?。 解りにくい質問で大変申し訳ないのですが どなたかご教授いただけないでしょうか。

  • SQL 表の結合

    SQLで2つの表から条件に合ったデータを取り出し、同じ列に表示させたいのですが、 どうやっても外部結合のようにすることしかできませんでした。 取り出したデータを縦に結合?させることはできるのでしょうか? 例) dataは月の上旬中旬下旬でそれぞれabcとします。 入力値はmonthとdayで、これらからuriageを選択します。 dataの取りうる値はa,b,c,ab,bc,abcとします。    table:A 売上表            table:B 上旬中旬下旬判断 ---------------------------   -----------  key | data | month | uriage   day | data ---------------------------    -----------   1 |  a  |  1  |  500      1 |  a   2 |  ab  |  1  |  800     … |  …   3 |  bc  |  1  |  400     10 |  a   4 |  c  |  1  |  100     11 |  b   5 |  abc |  1  |  900     … |  …   … |  …  |  …  | …     31 |  c ---------------------------    ----------- month = 1 , day =5のとき  table:Bより   SELECT data FROM table:B WHERE day = 5 としてdata "a" を得ます。 この"a"と同じdataを持つuriageを表示させたいので   SELECT uriage FROM table:A   WHERE month = 1 AND data = (SELECT data FROM table:B WHERE day = 5) として  table:query1  --------    uriage  --------    500  -------- を得ました。 ここまでは良いのですが、これに付け加えて、 table:Bから取り出したdata "a"をtable:Aのdataが含むとき(data = a,ab,abcのとき) その全てのuriageを表示させたく、 ワイルドカードを使おうと   SELECT uriage FROM table:A   WHERE month = 1 AND data = %(SELECT data FROM table:B WHERE day = 5)% 等としてみたのですが、上手くいきませんでした。 そこで、別のクエリーを作って   SELECT uriage FROM table:A   WHERE month = 1 AND data = 'ab' AND data = 'abc' として  table:query2  ---------   uriage  ---------    800  ---------    900  ---------- を得ました。 そして、最後に、 得られた2つの表をまとめて  ---------   uriage  ---------    500  ---------    800  ---------    900  --------- としたいのですが、   SELECT uriage, uriage FROM query1, query2 とすると  ------------------   uriage | uriage  ------------------    500  |  800    500  |  900  ------------------ となりますし、UNIONは使い方がよくわからないためシンタックスエラーにしかならず...。 そもそも、縦に結合?はできるのでしょうか??? あれこれ試してみたのですが、詰まってしまったので、 どなたか知恵をお貸しください。

  • この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文を教えて下さい 以下の2つのテーブルがあります。 TABLE1 --------------- ID,NAME,PRICE --------------- 1,部品A,100 2,部品B,200 3,部品C,300 TABLE2 --------------- ID,NAME,PRICE --------------- 1,部品Aのサブ1,1 1,部品Aのサブ2,2 2,部品Bのサブ1,5 2,部品Bのサブ2,5 --------------- SELECT TABLE1.NAME TABLE2.NAME TABLE1.PRICE TABLE2.PRICE WHERE TABLE1.ID = TABLE2.ID(+) TABLE2.PRICE = (SELECT MAX(?) ?) 期待する結果 ・TABLE1.NAME = 部品Aの場合 --------------- 部品A,部品Aのサブ2,100,2 ・TABLE1.NAME = 部品Bの場合 --------------- 部品B,部品Bのサブ1,200,5 TABLE1.NAME = 部品Cの場合 --------------- 部品C,,300, ・TABLE1のNAMEに、TABLE2のNAMEが関連付く(付かないものもある) ・外部結合とMAX関数を用いたい。 ・TABLE2のPRICEが大きい方を取得(同一の場合は、どちらかを取得)