• 締切済み

SQLの集計で「全て」の合計も表示したい

SQLの集計について教えて下さい。DBはSQLiteかMySQLです(下記テストはSQLiteにて) 「meibo」テーブルから結果(1)を表示するにSQL文(1)で実現できました。 ●meiboテーブル name    type  univ ---------------------------------- 鈴木一郎  国立  東大 高橋ニ郎  国立  東大 田中三郎  国立  京大 山本四郎  公立  大阪府立大 佐藤五郎  私立  慶応大 小川六郎  私立  早稲田大 ●結果(1) type別の人数 type   合計 ------------------- 公立   1 国立   3 私立   2 ●SQL文(1) SELECT type, count(name) FROM meibo GROUP BY type ORDER BY type ; ここに「全ての合計」行を加えて結果(2)を表示したい場合、1つのSQL文で可能でしょうか? それともSQL文(2)のように2つの文で行なうか、SQL文(1)の結果をプログラム側で処理して全ての合計を得るなどするしかないでしょうか?(typeの「全て」は無くても構わない) もし1つのSQL文で可能ならどういう風になるのでしょうか? ●結果(2) type   合計 ------------------- 全て   6     ←この行を追加したい 公立   1 国立   3 私立   2 ●SQL文(2) SELECT type, count(name) FROM meibo ; SELECT type, count(name) FROM meibo GROUP BY type ORDER BY type ;

みんなの回答

  • yambejp
  • ベストアンサー率51% (3827/7415)
回答No.4

単に全てをさきにORDER BY するだけ SELECT '全て'as type , count(name) as 合計 FROM meibo union all SELECT type type, count(name) FROM meibo GROUP BY type ORDER BY NOT type='全て' ,type ASC

回答No.3

#2です。SQL例にROLLUPを入れ忘れました。 SELECT type, count(name) FROM meibo GROUP BY type WITH ROLLUP

回答No.2

MySQLであれば、group by で rollup を指定すれば、合計も得られます。 実機確認してませんが、こんな感じです。 SELECT type, count(name) FROM meibo GROUP BY type 合計の行は、この場合は type列の値が null の行で総合計が返却されます。 なお、ROLLUP指定は標準SQLにも入りましたが、先行して実装しているRDBMSでは、指定方法が異なっている場合があるので注意してください。 >ただ、DESC付けると私立・国立・公立が降順になり、DESC無しだと「全て」が一番下になってしまいます。 >「全て」が一番上で残りが昇順(全て→公立→国立→私立)にするのはSQL的に可能でしょうか? 「公立」、「私立」などの文字コードを確認したうえで、言っているのでしょうか?

  • bigroad1
  • ベストアンサー率16% (29/180)
回答No.1

SELECT '全て' タイプ, count(name) FROM meibo union all SELECT type タイプ, count(name) FROM meibo GROUP BY type ORDER BY 1; 忘れたな~こんな感じだったような。

kyo999
質問者

お礼

回答ありがとうございます。 SELECT '全て' type , count(name) FROM meibo union all SELECT type type, count(name) FROM meibo GROUP BY type ORDER BY type DESC; で type   合計 ------------------- 全て    6 私立    2 国立    3 公立    1 まで表示できました。 ただ、DESC付けると私立・国立・公立が降順になり、DESC無しだと「全て」が一番下になってしまいます。 「全て」が一番上で残りが昇順(全て→公立→国立→私立)にするのはSQL的に可能でしょうか?

関連するQ&A

  • 集計関数の合計について

    お世話になります。 SQLSever2005を使用しています。 Count(*)で月毎のデータ件数を集計し、またその結果を出力するSQLを考えております。 SELECT  (SELECT Count(*) FROM TBL_TEST T1 WHERE T1.T_DATE>='2005/01/01' AND T1.T_DATE=<'2005/01/31') AS CNT_1,  (SELECT Count(*) FROM TBL_TEST T2 WHERE T2.T_DATE>='2005/02/01' AND T2.T_DATE=<'2005/02/31') AS CNT_2,   (SELECT Count(*) FROM TBL_TEST T3 WHERE T3.T_DATE>='2005/03/01' AND T3.T_DATE=<'2005/03/31') AS CNT_3,   (CNT_1+CNT_2+CNT_3) AS TOTAL_CNT ・・・・・・・・・・・・ (★)  FROM TBL_TEST T  WHERE ・・・・・・・・・ 結果(★)のところで『CNT_1は無効です』というエラーになってしまいます。 ちなみにAccessではエラーにならずに結果を出力していました。 上記のSQL文はどのように修正すればよろしいでしょうか?

  • 集計のSQLをお教え下さい

    初心者ですよろしくお願いします。 以下の様なテーブルがあり、年月と場所コードで 件数を出したいと考えております。 申し訳ありませんが、SQLの記述をお教え下さい。 年月日 | 場所コード |  20060510   1000 20060511   1000 20060511   2000 20060512   2000 20060601   1000 20060601   2000   ・    ・    ↓ 年月日 | 場所コード | count 200605   1000      2 200605   2000      2 200606   1000      1 200606   2000      1 年月日を年月にして集計したいと考えています。 select 年月日,場所コード,count(*) from table group by substring(年月日 from 1 for 6) ではうまくいきませんでした・・・ よろしくお願いします。

    • ベストアンサー
    • MySQL
  • Acess2003で複雑なSQL?

    Access2003で以下のSQLを実行させることはできるのでしょうか? 直接SQLで実行する方法と、Access独特の両方で実行する方法が知りたいです。 select name, count(*) from テーブル group by name order by 2 desc;

  • SQLの書き方

    select A.NO, A.NAME, count(B.TEN) FROM T1 A, T2 B GROUP BY A.NO ORDER BY 3 DESC 結果として以下のようになってほしいのですが、どのようにSQLを書けばよいのでしょうか? 結果 NO | NAME | TEN ---+------+----- 3 + 上村 + 40 1 + 吉田 + 11 2 + 浅野 + 6 T1テーブル NO | NAME ---+-------- 1 + 吉田 2 + 浅野 3 + 上村 T2テーブル NO | TEN ---+-------- 1 + 10 2 + 5 3 + 0 1 + 1 2 + 1 3 + 40

  • SQLのcount()とgroup by

    以下のようなテーブルがあったとき、 tbl1 id | score 1 | 100 1 | 200 1 | 300 2 | 200 2 | 100 3 | 300 3 | 400 3 | 500 3 | 600 idでまとめて個数を出すとすると、 SELECT count(*) FROM tbl1 group by id とすれば count(*) 3 2 4 と結果が返ってきますが、この結果にidを足して id | count(*) 1 | 3 2 | 2 3 | 4 というようなSQLはどうやって書けばいいのでしょうか? MySQLでは、 SELECT id, count(*) FROM tbl1 group by id と書けるのですが、これは標準的なSQLではNGなそうなので、気になって質問しました。 よろしくお願いします。

  • データの件数を集計するための SQL

    データの件数を集計するための SQL について教えてください。 例えば以下のようなテーブルがあります。 ▼テーブル 名前 |交通手段|日付 -----+--------+---- Aさん|バス |5/1 Aさん|バス |5/2 Aさん|バス |5/3 Bさん|バス |5/1 Bさん|電車 |5/2 ※「日付」については、本質問に直接の関係はありません。 このテーブルにクエリを発行して、以下の結果を取得したいと考えています。 ▼取得したい結果 名前 |交通手段|回数 -----+--------+---- Aさん|バス |3 Bさん|バス |1 Bさん|電車 |1 当方がイメージしている流れは以下の通りです。 SQL は苦手でして、これをひとつにまとめることができません。 1) GROUP BY で束ねる SELECT 名前, 交通手段 FROM テーブル GROUP BY 名前, 交通手段 2) 1)の結果の1件目をSELECTする SELECT COUNT(*) FROM テーブル WHERE 名前='Aさん' AND 交通手段='バス' 3) 1)の結果の2件目をSELECTする SELECT COUNT(*) FROM テーブル WHERE 名前='Bさん' AND 交通手段='バス' 4) 1)の結果の3件目をSELECTする SELECT COUNT(*) FROM テーブル WHERE 名前='Bさん' AND 交通手段='電車' なおレンタルサーバ上 (MySQL 5.0.77) で稼働させるため、 なるべく高速な SQL を希望いたします。

    • ベストアンサー
    • MySQL
  • SQLでグループ化した結果の件数を求めるには?

    下記のようなグループ化した結果を表示するSQL文を作りました。 SELECT メーカコード FROM 部品表 GROUP BY メーカコード, 部品番号 HAVING ((部品番号)="BUHIN1") これを実行するとちゃんと結果が出るのですが、その結果の件数を求めるにはどのようなSQL文を追加すれば宜しいのでしょうか? COUNT文を使うと出来そうなのですが、 SELECT メーカコード, COUNT(メーカコード) AS CNT FROM 部品表 GROUP BY メーカコード, 部品番号 HAVING ((部品番号)="BUHIN1") とやるとメーカコードの個別件数が表示されてしまいます。 どうぞよろしくお願いします。

  • 過去の質問を見て分からなかったSQL文があります

    お世話になります。 過去の質問の中で、文法が分からないものがあったので、教えてください。 [QNo.1118130] 全テーブルのデータの行数 という質問の中のNo.1の方の回答で次のようなSQL文がありました。 -------------------------------------------------------------------------------------- DECLARE @name nvarchar(30) DECLARE @sql nvarchar(200) DECLARE TCUR CURSOR FOR SELECT name FROM sysobjects WHERE type = 'U' OPEN TCUR FETCH NEXT FROM TCUR INTO @name -----・・・(1) WHILE (@@fetch_status <> -1) BEGIN SET @sql = 'SELECT count(*),''' + @name + ''' AS TNAME FROM '+ @name -----・・・(2) EXEC(@sql) FETCH NEXT FROM TCUR INTO @name -----・・・(3) END CLOSE TCUR DEALLOCATE TCUR -------------------------------------------------------------------------------------- (1)の部分について  "INTO @name"の部分で、@name には何を入れているのでしょうか? (2)の部分について  最初の 'SELECT count(*),'の部分は分かるのですが、これ以降で"'(シングルクォーテーション)"が沢山あって、何を囲っているのか分かりませんでした。  ("'"が多用されていて分かりませんでした) (3)の部分について  (1)と全く同じ文ですが、(1)と(3)でやっていることは違うのでしょうか。 すみませんが、アドバイスお願いします。

  • PHP SQL 問合せについて

    PHP SQL 問合せについて http://okwave.jp/qa/q7689206.html での質問の続きとなります。 No,name 1,ばなな 2,りんご 3,ばなな 4,みかん 5,ばなな 6,りんご 上記テーブルで 1,ばなな 3,ばなな 5,ばなな 2,りんご 6,りんご 4,みかん の結果を得るSQLはどのように記述すればよいでしょうか? 回答 select * from tableA x order by (select count(*) from tableA y where y.name = x.name ) ,No で解決していますが、 select * from tableA x where name ='果物' とした場合、結果が異なります。 (結果が多い順にならない) 出現回数が多い順に並べるには、どのような記述になりますか? データには「果物以外のデータが含まれている」とします。 宜しくお願い致します。

    • 締切済み
    • PHP
  • 割合(パーセント)を求めるにはどのようにSQLを書けばよいのでしょうか?

    SQLで グループ毎にカウントした数でなくて割合を求めたいのです。 select name, count(*) from データベース名 group by name order by 2 desc; とすると、以下のように200件あるデータで グループ(名前)毎に個数が表示されますが、 田中 70 上村 120 橘川 10 下のように割合(パーセント)を求めるにはどのようにSQLを書けばよいのでしょうか? 田中 70 35% 上村 120 60% 橘川 10 5%

    • ベストアンサー
    • MySQL