マンガでよめる痔のこと・薬のこと

以下のようなDB内に顧客id(ユニーク)とhob1,hob2,hob3のようなカラムがありまして、hob1,hob2,hob3には任意で趣味を表す値が入っております。

【hoge_db】
id | hob1 | hob2 | hob3
1 | 1 | 2 | 3
2 | 2 | 3 | NULL
3 | 3 | NULL | NULL
3 | NULL | NULL | NULL
・・・
【SELECTしたい値】
趣味1:1名
趣味2:2名
趣味3:3名

この各趣味を表す値に対する顧客数を求めたいのですが、3つのカラム全てに対してCOUNTをする方法が分かりません。。

どうかSQLにお強い方、お力を貸して頂けないでしょうか?

A 回答 (2件)

どうして、わざわざこんな扱いにくいテーブルにしているのでしょうかね。

。。

select
hob,count(hob)
from
(
select hob1 as hob from hoge_db where hob1 is not null
union all
select hob2 as hob from hoge_db where hob2 is not null
union all
select hob3 as hob from hoge_db where hob3 is not null
) as x
group by hob
order by hob
    • good
    • 2
この回答へのお礼

確かに扱い難いテーブル設計でした・・・
教えて頂いたunionで結合してからcountする方法で無事値が取り出せました!有難うございました!

お礼日時:2009/10/29 13:04

「1発でやろう」と考えると失敗します。


趣味が3個あるのだから、別々に求める必要があります。
コード1の数を求めるクエリは以下のようになります。
SELECT 1 AS shumi,
SUM(CASE WHEN 1 IN (hob1,hob2,hob3) THEN 1 ELSE 0 END) AS cnt
FROM hoge_db GROUP BY shumi

同様に2、3を求めて結合します。よって、解は以下の通り。

SELECT 1 AS shumi,
SUM(CASE WHEN 1 IN (hob1,hob2,hob3) THEN 1 ELSE 0 END) AS cnt
FROM hoge_db GROUP BY shumi
UNION
SELECT 2 AS shumi,
SUM(CASE WHEN 2 IN (hob1,hob2,hob3) THEN 1 ELSE 0 END) AS cnt
FROM hoge_db GROUP BY shumi
UNION
SELECT 3 AS shumi,
SUM(CASE WHEN 3 IN (hob1,hob2,hob3) THEN 1 ELSE 0 END) AS cnt
FROM hoge_db GROUP BY shumi
    • good
    • 0
この回答へのお礼

ご回答有難うございました!とても参考になりました!

お礼日時:2009/10/29 13:03

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

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

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

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

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

Q2つのテーブルのカウント結果を1行で取得

以下のようなデータ件数のテーブルが、別々のDBにあります。

SELECT COUNT(*) FROM AA.TBL01

------
TBL01
------
10


SELECT COUNT(*) FROM BB.TBL02

------
TBL02
------
5


それぞれのテーブルのカウント結果を、1行で取得する
ことは可能でしょうか?

<取得したい結果>
----------------
TBL01 TBL02
----------------
10 5


よろしくお願いします。
(SQL Server2005 Standard)

Aベストアンサー

テーブル2つ程度なら、これでもいいかと思います。
SELECT
(SELECT COUNT(*) FROM AA.TBL01) TBL01,
(SELECT COUNT(*) FROM BB.TBL02) TBL02

Q2つの項目が重複するレコードを抽出する方法はありますか?

MySQL4.1で既存データに対し複合キーを新しく設定したいのですが、

ALTER TABLE `test` ADD PRIMARY KEY (`a`,`b`)

としても重複データが存在する為、作成できませんでした。

10万件あるテーブルから重複するレコードを手動で削除したいのですが、aとbが重複しているレコードだけ抽出するSQL文はありますでしょうか?

Aベストアンサー

select * from `test`
where (a,b) in(
select a,b from `test`
group by a,b
having count(*)>1)

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

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を使うとか、レコードの更新時刻を突っ込むとか。

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

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

a b c
100 200 300

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

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

Aベストアンサー

Oracle上で可能です。

select a+b+c from hogehoge;

Qcount関数の値を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

とやってみたんですが、検索出来ませんでした。
ご存知の方、ご教授の程、宜しくお願いいたします。

Aベストアンサー

グルーピングした値を条件にするにはwhereではなくhavingを使います。以下のようにしてみてください。

select column1,count(column2) as column2_num
from hoge_table
group by column2_num
having count(column2) = 1

QSQL文について(片方のテーブルに存在しないレコード抽出)

以下のような2つのテーブルがあったとして、
2つともに存在する「店コード」を抽出するのはSQLは分かるのですが、
片方に存在しない「店コード」(以下の例の場合、「2」)を抽出するSQLを
一文で書くにはどうすればいいのでしょうか?

<店テーブル>
店コード住所・・・(その他、基本情報)
1aaa
2bbb
3ccc

<販売テーブル>
店コード販売品目・・・(その他、販売数など)
1xxx
3zzz

Aベストアンサー

オプティマイザ次第だけど、NOT-INは、あまりお勧めでない。
外部結合も索引があっても有効に使われないので、お勧めでない。

select * from A where not exists(select 1 from B where A.店コード=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.年月 = 任意の値

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

QSELECT文で、指定カラム以外の全カラムを一括指定って可能でしょうか

SELECT文で、指定カラム以外の全カラムを一括指定って可能でしょうか?
MYSQLサーバのバージョンは5.0.77です。

下記のように「*」を使用して指定テーブルの全カラムを表示する方法がありますが、
SELECT TableName.* FROM TableName

上記の逆で、指定テーブルの指定カラム以外の全カラムを一括指定って可能でしょうか?
例えば下記のような「^」みたいな、又は同等な書き方があれば良いなと思ってまして。
SELECT TableName.^ColumnName1 FROM TableName

ちなみに、下記のように一つ一つ表示したいカラムを指定する方法以外です。
SELECT TableName.ColumnName2 , TableName.ColumnName3 FROM TableName

よろしくお願いします。

Aベストアンサー

ない。
SQL文でそんなことをするより、メソッドとして作ればいいんじゃないですか。
だいたい、それ以外のカラムの数がわからないし、並びも不明だし。

#1に方と同じで
SELECT * from xxxx
なんてのは正気の人間は書きません。
カラムの数も位置も属性もわからないSQL文の結果をどうやって扱うのか。

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....続きを読む


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

人気Q&Aランキング