今だけ人気マンガ100円レンタル特集♪

テーブルA
年齢,人数
20,15
21,11
22,26
....
30,5
31,88
...
60,5
上記テーブルAからのSQLで下記のデータが欲しいと思っております。
【欲しい結果】
年齢範囲,人数
20~24,50
25~29,33
30~34,199
...

ただし、
select '20~24'as 年齢範囲,count(*)as 人数 from テーブルA where 条件1
union
select '25~29'as 年齢範囲,count(*)as 人数 from テーブルA where 条件2
union
select '30~34'as 年齢範囲,count(*)as 人数 from テーブルA where 条件3
...
というSQLは使いたくないです。(テーブルAの記述が長めなので、同じものを複数記述したくないのです)

また結果が
項目名:20~24,25~29,30~34,...
レコード:50,33,199,...
というのも遠慮したいです。

CASE文やsum、groupを使えば、できそうな気がするのですが、、、
ご教授お願い致します。

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

A 回答 (5件)

select substring('-----20~24/25~29/30~34', 分布区分*6, 5) AS 年齢範囲,Sum(人数) as 総数 FROM (select *, (年齢 / 5 - 3) as 分布区分 FROM 年齢分布) AS X GROUP BY X.分布区分;



なにげなく、質問文にある Count関数を使っていました。
もちろん、Sum関数です。
    • good
    • 0
この回答へのお礼

回答ありがとうございます。確かに「欲しい結果」になりました。
区分とsubstringとは思いもつきませんでした。
区分の考え方は今後のSQLライフに応用できると感じました。

お礼日時:2007/08/07 15:53

No1です


失礼します。間違いました。

SELECT  '20~24', SUM(CASE WHEN 年齢 >= 20 AND 年齢 <= 24 THEN 人数 END),
     '25~29', SUM(CASE WHEN 年齢 >= 25 AND 年齢 <= 29 THEN 人数 END),
     '30~34', SUM(CASE WHEN 年齢 >= 30 AND 年齢 <= 34 THEN 人数 END)
FROM   テーブルA
WHERE   条件1 AND 条件2 AND 条件3
    • good
    • 0
この回答へのお礼

回答ありがとうございます。
この結果だと1レコードに、全ての年齢範囲および人数が載る形になりますね。
こうゆうデータが必要なときもあると思うので参考にさせていただきます。

お礼日時:2007/08/07 16:00

<年齢分布>



ID___区分__年齢___人数
1____1_______20______1
2____1_______21______1
3____2_______25______1
4____3_______34______1
5____3_______31______1

select substring('-----20~24/25~29/30~34', 区分*6, 5) AS 年齢範囲,count(*) as 人数 from 年齢分布 group by 区分;

この SQL文の実行結果は次のようです。

____|年齢範囲|人数|
____|_____________________
__1|20~24____|____2|
__2|25~29____|____1|
__3|30~34____|____2|

と、列[区分]を付加するという解決方法です。

もちろん、

select substring('-----20~24/25~29/30~34', 分布区分*6, 5) AS 年齢範囲,count(*) as 人数 FROM (select *, (年齢 / 5 - 3) as 分布区分 FROM 年齢分布) AS X GROUP BY X.分布区分;

でも同じ結果をえます。
    • good
    • 0

SQL Serverは2000? 2005?



テーブルAのデータ例では、20~22で52人いるが、欲しい結果で20~24が50人とは、何を求めた結果ですか?

>項目名:20~24,25~29,30~34,...
>レコード:50,33,199,...
>というのも遠慮したいです。

母体件数がどのくらいあるのか分かりませんが、性能を重視するなら、上記のような検索の方が、速く行なえるかも知れませんよ?

この回答への補足

お世話になります。

>SQL Serverは2000? 2005?
2000になります。
本件はSQL記述に関する質問であり、バージョンの違いによる問題発生はほぼ無いと考え、割愛致しました。

>テーブルAのデータ例では、20~22で52人いるが、欲しい結果で20~24が50人とは、何を求めた結果ですか?
失礼致しました。人数の記述を間違えました。
テーブルAは年齢毎の人数を表すもので、欲しい結果は年齢範囲に相応した年齢の人数の和になります。

>母体件数がどのくらいあるのか分かりませんが、
今回の母体件数は数百です。

>項目名:20~24,25~29,30~34,...
>レコード:50,33,199,...
>上記のような検索の方が、速く行なえるかも知れませんよ?
UNIONの方法や上記のような方法で、欲しい情報を取得できることはわかっていました。
この「欲しい情報」に対して、私の思いつかない様々なアプローチ方法があるのでは?
と思い、今回質問をあげさせていただきました。
データ件数が少ないこともあり、レスポンスは気にしておりませんでしたが、
「レスポンスを考慮した方法」というのも確かにアプローチ方法のひとつになりますね。

補足日時:2007/08/08 18:09
    • good
    • 0

こんにちは。


こんな感じで如何でしょうか。

SELECT  '20~24', SUM(CASE WHEN 年齢 >= 20 AND 年齢 <= 24 THEN 1 END),
     '25~29', SUM(CASE WHEN 年齢 >= 25 AND 年齢 <= 29 THEN 1 END),
     '30~34', SUM(CASE WHEN 年齢 >= 30 AND 年齢 <= 34 THEN 1 END)
FROM   テーブルA
WHERE   条件1 AND 条件2 AND 条件3
    • good
    • 0

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

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

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

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

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

Q成績と性別毎の人数分布を集計するSQL文は?

SQL文で成績と性別での人数分布を求めるクロス集計関数が出来ず困ってます。

サンプルとしては
学年 性別 評価(ABC)
1年 男  A
1年 女  A
1年 男  A
1年 男  B
2年 男  B
2年 女  C

欲しい出力としては各サンプル毎の人数です。
1年 男-A評価,男B評価,男C評価,女A評価,女B評価,女C評価
2年 男-A評価,男B評価,男C評価,女A評価,女B評価,女C評価
3年 男-A評価,男B評価,男C評価,女A評価,女B評価,女C評価



という具合です。

以前は
SELECT COUNT(*) AS 分布人数, 性別, 成績 FROM 成績
GROUP BY 年齢, 性別, 学年 HAVING 学年 = @がくねん ORDER BY 年齢,成績
というSQL文で1学年毎に抽出していました。
クロス集計で1つのSQL文で出力したいのですがいかがでしょうか?

Aベストアンサー

表の列構成、元のデータ例、得たい結果例が示されていると、回答する側としても分かりやすいのですけどね。

次のようなSQLでは、いかがでしょうか?

select
学年,
count(case when 性別='m' and 評価='A' then 1 else null end) as 男A,
count(case when 性別='m' and 評価='B' then 1 else null end) as 男B,
count(case when 性別='m' and 評価='C' then 1 else null end) as 男C,
count(case when 性別='w' and 評価='A' then 1 else null end) as 女A,
count(case when 性別='w' and 評価='B' then 1 else null end) as 女B,
count(case when 性別='w' and 評価='C' then 1 else null end) as 女C
from t1
group by 学年
;

表の列構成、元のデータ例、得たい結果例が示されていると、回答する側としても分かりやすいのですけどね。

次のようなSQLでは、いかがでしょうか?

select
学年,
count(case when 性別='m' and 評価='A' then 1 else null end) as 男A,
count(case when 性別='m' and 評価='B' then 1 else null end) as 男B,
count(case when 性別='m' and 評価='C' then 1 else null end) as 男C,
count(case when 性別='w' and 評価='A' then 1 else null end) as 女A,
count(case when 性別='w' and ...続きを読む

QInner join と Left joinの明確な違いは?

Inner join と Left joinの違いがよくわかりません。
教えてください。

Aベストアンサー

出てくる結果が違います。

テーブル1のフィールド1に、






が、

テーブル2のフィールド1に、






が入力されている場合、

SELECT [テーブル1].[フィールド1], [テーブル2].[フィールド1]
FROM テーブル1 LEFT JOIN テーブル2 ON [テーブル1].[フィールド1]=[テーブル2].[フィールド1];
では、結果は、
テーブル1.フィールド1 テーブル2.フィールド1
1               1
2               2
3               3
4               NULL
5               NULL
6               NULL
の6レコードが出力されますが、

SELECT [テーブル1].[フィールド1], [テーブル2].[フィールド1]
FROM テーブル1 INNER JOIN テーブル2 ON [テーブル1].[フィールド1]=[テーブル2].[フィールド1];
では、結果は、
テーブル1.フィールド1 テーブル2.フィールド1
1               1
2               2
3               3
の3レコードしか出力されません。

出てくる結果が違います。

テーブル1のフィールド1に、






が、

テーブル2のフィールド1に、






が入力されている場合、

SELECT [テーブル1].[フィールド1], [テーブル2].[フィールド1]
FROM テーブル1 LEFT JOIN テーブル2 ON [テーブル1].[フィールド1]=[テーブル2].[フィールド1];
では、結果は、
テーブル1.フィールド1 テーブル2.フィールド1
1               1
2               2
3           ...続きを読む

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.区分

Q【SQL】他テーブルに含まれる値に合致する行を抽出

SQL素人ですが、SQLが使えるツールからデータを抽出したく、SQL文を教えていただけますでしょうか。

・テーブルA:会員データが格納されている(氏名、メルアド、郵便番号等が入っている)
・テーブルB:特定の郵便番号のみが入っている

テーブルAのデータの中からテーブルBに入っている郵便番号に合致するメルアドを抽出したい。

何卒宜しくお願い申し上げます。

Aベストアンサー

>SQLが使えるツール
によって変わってくる場合がありますが、
SELECT メルアド FROM テーブルA
WHERE 郵便番号 IN (SELECT 郵便番号 FROM テーブルB)
とか。

QSQLでグループ化した結果の件数を求めるには?

下記のようなグループ化した結果を表示するSQL文を作りました。

SELECT メーカコード FROM 部品表 GROUP BY メーカコード, 部品番号 HAVING ((部品番号)="BUHIN1")

これを実行するとちゃんと結果が出るのですが、その結果の件数を求めるにはどのようなSQL文を追加すれば宜しいのでしょうか? COUNT文を使うと出来そうなのですが、

SELECT メーカコード, COUNT(メーカコード) AS CNT FROM 部品表 GROUP BY メーカコード, 部品番号 HAVING ((部品番号)="BUHIN1")

とやるとメーカコードの個別件数が表示されてしまいます。
どうぞよろしくお願いします。

Aベストアンサー

こんにちわ。

Oracle であれば、こんな書き方ができるかと思います。
SQL> SELECT COUNT(*) FROM (SELECT メーカコード FROM 部品表 GROUP BY メーカコード, 部品番号 HAVING ((部品番号)='BUHIN1'));

でも件数を取得するのであれば、わざわざSQL 文を発行
するよりも、SQL%ROWCOUNT (PL/SQL) や、
sqlca.sqlerrd[2] (Pro*C) を使った方が DB に余計な負荷がかからなくて
良いと思います。

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.年月 = 任意の値

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

Qdate型でのbetweenについて教えてください。

皆様、新年明けましておめでとうございます。

早速ですが、date型でのbetweenについて教えてください。

SQL文
SELECT * FROM test WHERE date between date '2007-12-01' and date '2007-12-31'

を発行すると、2007-12-31のレコードがあるのに該当しません・・・

試しにSQL文を
SELECT * FROM test WHERE date between date '2007-12-01 00:00:00' and date '2007-12-31 23:59:59'
としても2007-12-31のレコードは検索されません・・・
SQL文を
SELECT * FROM test WHERE date between date '2007-12-01' and date '2008-01-01'
にすると2007-12-31が該当するのですが、
SELECT * FROM test WHERE date between date '2007-12-01' and date '2007-12-31'
では2007-12-31のレコードは該当しないものでしょうか??

select * from test where num between 10 and 100
とした場合では、num が 10 ~ 100 のものが問い合わされますよね??
date型になるとこうならないのでしょうか??

よろしくお願いします。

皆様、新年明けましておめでとうございます。

早速ですが、date型でのbetweenについて教えてください。

SQL文
SELECT * FROM test WHERE date between date '2007-12-01' and date '2007-12-31'

を発行すると、2007-12-31のレコードがあるのに該当しません・・・

試しにSQL文を
SELECT * FROM test WHERE date between date '2007-12-01 00:00:00' and date '2007-12-31 23:59:59'
としても2007-12-31のレコードは検索されません・・・
SQL文を
SELECT * FROM test WHERE date between date...続きを読む

Aベストアンサー

No.1です。
列の属性をtimestampにして実行してみました。

Welcome to psql 8.2.0, the PostgreSQL interactive terminal.
farm=# create table testtbl6 (hoge timestamp);
CREATE TABLE
farm=# insert into testtbl6 values('2007-12-31');
INSERT 0 1
farm=# select * from testtbl6;
hoge
---------------------
2007-12-31 00:00:00
(1 row)

farm=# select * from testtbl6 where hoge between '2007-01-01' and '2007-12-31';
hoge
---------------------
2007-12-31 00:00:00
(1 row)

farm=# select * from testtbl6 where hoge between date '2007-01-01' and date '2007-12-31';
hoge
---------------------
2007-12-31 00:00:00
(1 row)

●時間だけを多少進めたデータを追加してみました

farm=# insert into testtbl6 values('2007-12-31 01:00:00');
INSERT 0 1
farm=# select * from testtbl6;
hoge
---------------------
2007-12-31 00:00:00
2007-12-31 01:00:00
(2 rows)

farm=# select * from testtbl6 where hoge between '2007-01-01' and '2007-12-31';
hoge
---------------------
2007-12-31 00:00:00
(1 row)

farm=# select * from testtbl6 where hoge between date '2007-01-01' and date '200
7-12-31';
hoge
---------------------
2007-12-31 00:00:00
(1 row)

よって、あなたのDBに登録してあるデータは、2007-12-31と午前0時を少し回っているデータが登録されているため、
検索でヒットしないのではないのでしょうか?

No.1です。
列の属性をtimestampにして実行してみました。

Welcome to psql 8.2.0, the PostgreSQL interactive terminal.
farm=# create table testtbl6 (hoge timestamp);
CREATE TABLE
farm=# insert into testtbl6 values('2007-12-31');
INSERT 0 1
farm=# select * from testtbl6;
hoge
---------------------
2007-12-31 00:00:00
(1 row)

farm=# select * from testtbl6 where hoge between '2007-01-01' and '2007-12-31';
hoge
---------------------
2007-12-31 ...続きを読む

Q「いずれか」と「いづれか」どっちが正しい!?

教えて下さいっ!
”どちらか”と言う意味の「いずれか」のかな表記として
「いずれか」と「いづれか」のどちらが正しいのでしょう???

私は「いずれか」だと思うんですが、辞書に「いずれか・いづ--。」と書いてあり、???になってしまいました。
どちらでもいいってことでしょうか?

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を書く。

QSQL文 合計と、特定の値を取り出す

テーブル名:料金表

ID  項目CD  金額
-------------------------
1   101   1000
1   102   2000 
1   103    100
2   101   1000
2   102   2000
2   103    50
3   101   1000
3   102   2000

上記のテーブルがあります
IDと、金額の合計と、項目CDが103のものだけ金額をだしたいのです

理想SELECT結果

ID  合計  項目CD:103
-------------------------
1   3100   100
2   3050    50
3   3000    0(もしくはnull) 



select ID,sum(金額) as 合計
from 料金表
where ID in(1,2,3)
group by ID,金額

でIDと合計までは出せました
特定の項目の値を取り出すのはどうしたらいいでしょうか?

Aベストアンサー

こういう場合はJOIN句を使うとうまくいきます。
Accessで通ったので、多分SQLServerでも大丈夫だと思います。
なお、式の意味はizayoi2004さんのものとまったく同じです。

SELECT TBL1.ID AS ID, TBL1.合計 AS 合計, TBL2.金額 AS 項目CD103
FROM (SELECT ID, sum(金額) AS 合計 FROM 料金表 GROUP BY ID) AS TBL1
LEFT JOIN (SELECT * FROM 料金表 WHERE 項目CD=103) AS TBL2 ON TBL1.ID=TBL2.ID;


人気Q&Aランキング