人に聞けない痔の悩み、これでスッキリ >>

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 ;

このQ&Aに関連する最新のQ&A

A 回答 (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
    • good
    • 0

#2です。

SQL例にROLLUPを入れ忘れました。

SELECT type, count(name) FROM meibo GROUP BY type WITH ROLLUP
    • good
    • 0

MySQLであれば、group by で rollup を指定すれば、合計も得られます。



実機確認してませんが、こんな感じです。

SELECT type, count(name) FROM meibo GROUP BY type

合計の行は、この場合は type列の値が null の行で総合計が返却されます。

なお、ROLLUP指定は標準SQLにも入りましたが、先行して実装しているRDBMSでは、指定方法が異なっている場合があるので注意してください。

>ただ、DESC付けると私立・国立・公立が降順になり、DESC無しだと「全て」が一番下になってしまいます。
>「全て」が一番上で残りが昇順(全て→公立→国立→私立)にするのはSQL的に可能でしょうか?

「公立」、「私立」などの文字コードを確認したうえで、言っているのでしょうか?
    • good
    • 0

SELECT '全て' タイプ, count(name) FROM meibo


union all
SELECT type タイプ, count(name) FROM meibo
GROUP BY type ORDER BY 1;

忘れたな~こんな感じだったような。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。

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的に可能でしょうか?

お礼日時:2009/12/15 22:17

このQ&Aに関連する人気のQ&A

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!

このQ&Aを見た人はこんなQ&Aも見ています

関連するカテゴリからQ&Aを探す

このQ&Aを見た人が検索しているワード

このQ&Aと関連する良く見られている質問

Q【SQL】違うフィールド同士の集計をしたい

表記の件ですが、SUM関数はフィールドが同じで違うレコードを集計していくのですが、そうではなく、違うフィールド同士を集計したいのですが、どうしたらいいのかわかりません。
(※アクセスなら可能なのかもしれませんが。)

a b c
100 200 300

上記の場合、a+b+c= 600 という戻り値が欲しいのです。

恐れ入りますが、どなたか(可能不可能でもOK)ご教授ください。
よろしくお願いします。

Aベストアンサー

Oracle上で可能です。

select a+b+c from hogehoge;

QMAX値を条件にデータを取得するには?

SQL文で困っています。
ご教授下さい。


下記のようなデータがあった場合、それぞれの区分毎に
年月が最大(最新)のデータを取得したいです。
(実際には1レコードにその他項目があり、それらも取得します。)
<検索対象データ>
区分 年月   金額
-----------------------------
A   200412  600
A   200503  560
B   200311  600
B   200508  1000
B   200504  560
C   200508  400
C   200301  1100


<取得したいデータ>

区分 年月   金額
-----------------------------
A   200503  560
B   200508  1000
C   200508  400

よろしくお願いします。

Aベストアンサー

テーブル名をXXXとすると次のようなSQLでよいと思います。(最善の方法かどうかは自信がないですが)

select B.* from (select 区分, max(年月) as 年月 from XXX group by 区分) As A
inner join XXX as B on A.区分 = B.区分 and A.年月 = B.年月
order by B.区分

Q3つの表の外部結合

表A、B、Cの3つがあり、Aのすべての行を出力したいと考えています。
外部結合を用いるのだとは思うのですが、3つの表に対して行う場合の
書き方がわからず困っています。
ご教授いただけないでしょうか?
select * from a,b,c
where a.商品ID =b.商品ID (+) and b.商品ID (+) =c.商品ID (+)
としてみましたが、うまくいきませんでした。

Aベストアンサー

ansi構文の趣旨からいえば、結合条件と絞り込み条件は分けて書くので・・

select *
from a
left join b on (a.商品ID =b.商品ID)
left join c on (b.商品ID =c.商品ID)
where a.年月 = 任意の値

と書くのが一般的でしょうね。

QGROUP BYを行った後に結合したい。

oracle8iを使用しています。
2つのテーブルを結合したいと思っていますが、
テーブル構成が、N対Nのテーブルのため、
片方をグループ化したあとに結合させようと思っています。

ところが、単純にGroup byを使うと、結合した後に
グループ化してしまうために、期待した値がひょうじされません。

なんとか、1回のSQLで正しく情報をとることはできないものでしょうか。

Aベストアンサー

>テーブル構成が、N対Nのテーブルのため、
>片方をグループ化したあとに結合させようと思っています。

多分こんな形ではどうですか?

SELECT A.KEY,B.KEY,
FROM TABLE_A A
,(SELECT KEY FROM TABLE_B
GROUP BY KEY) B
WHERE A.KEY=B.KEY;

要はFROM句にテーブル名ではなく、SELECT~GROUP BYを書く。

QSELECTで1件のみ取得するには?

こんにちわ。
いまORACLE9iを使用している者です。

ACCESSでは
SELECT TOP 1 項目名 FROM テーブル名
ORDER BY 項目名;
で並べ替えたデータ群のうち,先頭の1件だけを
取ることができますが,
ORACLEでそのような機能(SQL)はあるでしょうか?
教えてください。
よろしくお願いします。

Aベストアンサー

order by と rownum を併用する場合は注意が必要です。

[tbl01]
cola | colb
------------
1000 | aaaa
1001 | bbbb

というデータがある場合、
select cola from tbl01 where rownum < 1 order by cola desc;
とすると、「1001」ではなく、「1000」が返されます。
これは、order by の前に rownum < 1 が適用されてしまうからです。

解決するには、
select aaa from (select cola aaa from tbl01 order by cola desc) where rownum = 1;
とすれば良いです。

Qグループ集計と総合集計を行うには

以下のようなテーブルが存在します。

A   B   C
1   1   3
1   2   4
2   3   3
2   2   3
・・・・

求めたい事は、
・Cの総合計
・A列におけるCの合計
・A&B列におけるCの合計
です。3回SQLをまわせばいい事かもしれませんが、行数がすさまじく多いので1回もしくは2回のSQLで上記の結果が得られればいいなと思っています。

何かいい案がありましたらご教授いただきたくよろしくお願いします。

Aベストアンサー

#1回答者です。

#1で示した集計結果行を、nullで判定するのでなく、0か1かで得られる記述もできますので、参考まで。

【SQL例】
select A,B,sum(c),grouping(A) as gA,grouping(B) as gAB
from t1
group by A,B with rollup

【結果】・・・「-」はnull値です
A B sum(c) gA gAB
1 1 3 0 0
1 1 4 0 0
1 - 7 0 1 →A=1の合計
2 2 3 0 0
2 3 3 0 0
2 - 6 0 1 →A=2の合計
- - 13 1 1 →総合計

Qテーブルからのselectにおいてデータの有無により結果をわけたい

id | point
----+-------
1 | 10
2 | 9
3 | 5
....
というテーブルがあるとします.
idを指定してpointを得たいのですが、そのidがこのテーブルに存在しない場合は空の結果ではなく0を返したいのです.
plpgsqlなどを使いif文で場合分けすればできることはわかっているのですがSQL文だけで(それもできれば1文で)これを実現する方法はあるでしょうか?
よろしくお願い致します。

Aベストアンサー

変則的ですが、これでよければidがユニークでなくても大丈夫ですし、集合関数を使わなくてもOKです。

select dm.id,case when ex1.point is null then 0 else ex1.point end from
(select ? as id) as dm left join ex1 on dm.id = ex1.id;

?を適当に変えてください。
chukenkenkouさんの発想はこれですよね。

QSQLで特定の項目の重複のみを排除した全項目を取得する方法

私は仕事上でデータベースを扱っていて、タイトルのような処理を行う必要があるのですが、いかんせん方法がわからずネット上を検索しても同様だったためここで質問させていただきます。

質問点を簡単に説明いたしますと、
たとえばAというテーブルがあって、

項目名1 項目名2 項目名3 項目名4
 A    あ    ア    亜
 A    い    ア    以
 A    う    ア    宇
 B    え    イ    江
 B    お    イ    尾

上のような構造になっている場合に「項目名1」について重複している項目を排除し、結果として


項目名1 項目名2 項目名3 項目名4
 A    あ    ア    亜
 B    え    イ    江

上のようなデータを取得したいのです。
この時に、Aの重複を排除して取得するレコードは1~3行目のどれでもよいです。
また、データを取得する際には必ずそのレコードの「全項目」を取得したいのでDistinctはうまく使えませんでした。

どなたか詳しい方、方法を教えてくださると幸いです。回答お待ちしております。

私は仕事上でデータベースを扱っていて、タイトルのような処理を行う必要があるのですが、いかんせん方法がわからずネット上を検索しても同様だったためここで質問させていただきます。

質問点を簡単に説明いたしますと、
たとえばAというテーブルがあって、

項目名1 項目名2 項目名3 項目名4
 A    あ    ア    亜
 A    い    ア    以
 A    う    ア    宇
 B    え    イ    江
 B    お    イ    尾

上のよ...続きを読む

Aベストアンサー

比較可能で一意性のある値をもてる項目6をテーブルに追加して、

select T.* from T, (select Item1,min(Item6) as Item6 from T group by item1) W where T.item6=W.item6;

――ってやるのが、一番手っ取り早いと思います。
他のところに影響がでないのであればですが。
oracleならrowidを使うとか、レコードの更新時刻を突っ込むとか。

Q2つのテーブルから条件に一致しないデータ抽出

2つのテーブルから条件に一致しない行のみ抜き出しCSV
か他のテーブルに抜き出す処理を作ろうと思っています。

そこで質問なのですが、以下の2つのテーブルから
条件に一致しないコードのみ抜き出すSQL文などありますか?

-----------------------------------------
マスターテーブル
コード、ネーム1、ネーム2、店コード
1、あ、い、6
2、う、え、8
3、お、か、4
4、き、く、2


店コードテーブル
店コード、店区分
1、スーパー
2、コンビニ
3、デパート
4、ホームセンター
------------------------------------------

条件は、マスターテーブルの店コードが店コードテーブルに存在
しないデータのみ抽出です。

抽出結果は、以下の様にしたいです。
1、あ、い、6
2、う、え、8

このような考え大丈夫でしょうか?
SELECT *
FROM マスターテーブル AS M INNER JOIN 店コードテーブル AS S
ON M.店コード = S.店コード

わかりずらい質問ですがよろしくお願いします。

2つのテーブルから条件に一致しない行のみ抜き出しCSV
か他のテーブルに抜き出す処理を作ろうと思っています。

そこで質問なのですが、以下の2つのテーブルから
条件に一致しないコードのみ抜き出すSQL文などありますか?

-----------------------------------------
マスターテーブル
コード、ネーム1、ネーム2、店コード
1、あ、い、6
2、う、え、8
3、お、か、4
4、き、く、2


店コードテーブル
店コード、店区分
1、スーパー
2、コンビニ
3、デパート
4、ホームセンタ...続きを読む

Aベストアンサー

このような考え大丈夫でしょうか?
SELECT *
FROM マスターテーブル AS M INNER JOIN 店コードテーブル AS S
ON M.店コード = S.店コード

店コードが一致するレコードを抽出しているのですね。
はい、大丈夫です。
もっとも単純に、分かりやすい式を書くのであれば

この条件否定なので
left outer join で結合して、結合できなかったデータ、
つまり、店がNullのデータを取れば抽出できます。

SELECT *
FROM マスターテーブル AS M left outer join 店コードテーブル AS S
ON M.店コード = S.店コード
where S.店コード is null

または、
SELECT *
FROM マスターテーブル as M
where M.店コード not in ( select 店コード from 店コードテーブル)

等でいけるでしょう。

ただ、参考URLにもありますように、
is null とか not in は遅いです。(Indexで見れなくなるので)
大量データを扱うような場合や、速度が求められるような場合は
別途クエリを検討しましょう。

参考URL:http://www.geocities.jp/mickindex/database/db_optimize.html

このような考え大丈夫でしょうか?
SELECT *
FROM マスターテーブル AS M INNER JOIN 店コードテーブル AS S
ON M.店コード = S.店コード

店コードが一致するレコードを抽出しているのですね。
はい、大丈夫です。
もっとも単純に、分かりやすい式を書くのであれば

この条件否定なので
left outer join で結合して、結合できなかったデータ、
つまり、店がNullのデータを取れば抽出できます。

SELECT *
FROM マスターテーブル AS M left outer join 店コードテーブル AS S
ON M.店コード = S....続きを読む

QSQLでSUMなどの関数でデータが無い時に0を返したい。

SQLでSUMなどの関数でデータが無い時に0を返したい。

(例)
SELECT SUM(項目) FROM テーブル WHERE 条件

ここで、条件に一致するデータが1件も無かった時ですが、
何かNULLのような物が1件返ってきているようです。
この条件に一致する物が無かった時に、
0を返したいのですが、可能でしょうか?

よろしくお願いします。

Aベストアンサー

NULLが入りうるカラムはNVLで括った方が安全です。
SELECT SUM(NVL(項目,0)) from テーブル WHERE 条件

SUMの場合は、変わりないですが、AVGだと結果が違ったりします。
件名を見て、SUM以外の関数についても含むようだったので一応。


このQ&Aを見た人がよく見るQ&A

人気Q&Aランキング