08/10/09 13:11:14
このスレは
「こういうことをやりたいんだけどSQLでどう書くの?」
「こういうSQLを書いたんだけどうまく動きません><」
などの質問を受け付けるスレです。
SQLという言語はISOによって標準化されていますが
この標準を100%実装したDBMSは存在せず、
また、DBMSによっては標準でない独自の構文が
追加されていることもあります。
質問するときはDBMS名を必ず付記してください。
【質問テンプレ】
・DBMS名とバージョン
・テーブルデータ
・欲しい結果
・説明
前スレ:SQL質疑応答スレ 6問目
スレリンク(db板)
2:NAME IS NULL
08/10/09 13:11:59
SQL言語リファレンス一覧
Oracle Database
URLリンク(otndnld.oracle.co.jp)
Microsoft SQL Server
URLリンク(msdn.microsoft.com)
IBM DB2 Database
URLリンク(publib.boulder.ibm.com) (目次から参照情報→SQL)
PostgreSQL
URLリンク(www.postgresql.jp)
MySQL
URLリンク(dev.mysql.com)
参考リンク
URLリンク(sql.main.jp)
URLリンク(www.atmarkit.co.jp)
URLリンク(oraclesqlpuzzle.hp.infoseek.co.jp)
URLリンク(www.techscore.com)
3:NAME IS NULL
08/10/09 13:12:31
過去ログ
SQL質疑応答スレ スレリンク(db板)
SQL質疑応答スレ Part 2 スレリンク(db板)
【帰ってきた】SQL質疑応答スレ スレリンク(db板)
【帰ってきた】SQL質疑応答スレ 2問目 スレリンク(db板)
【帰ってきた】SQL質疑応答スレ 3問目 スレリンク(db板)
【帰ってきた】SQL質疑応答スレ 4問目 スレリンク(db板)
SQL質疑応答スレ 5問目 スレリンク(db板)
4:NAME IS NULL
08/10/09 13:13:10
よくある質問1
(問)
ID | DATE | DATA
--+----------+-----
1 | 2007-11-11 | aaa
2 | 2007-11-11 | bbb
1 | 2007-11-10 | ccc
3 | 2007-11-12 | ddd
3 | 2007-11-11 | eee
4 | 2007-11-10 | fff
1 | 2007-11-12 | ggg
このようなテーブルから、下記のように
1 | 2007-11-12 | ggg
3 | 2007-11-12 | ddd
2 | 2007-11-11 | bbb
4 | 2007-11-10 | fff
各idに対して最新の1件だけ抽出するSQLの書き方を教えてください。
(答)
select A.ID,
A.DATE,
A.DATA
from TableName A
inner join
(select ID, max(DATE) as MAX_DATE
from TableName
group by ID
) B
on A.ID = B.ID
and A.DATE = B.MAX_DATE
;
5:NAME IS NULL
08/10/09 13:14:25
よくある質問2
(問)
key data
----------------
1 a
1 a
1 b
1 b
1 a
2 b
2 a
2 a
というテーブルから
key a b
--------------------
1 3 2
2 2 1
というExcelのピボットの様なデータを取得したいのですが、どういうSQLになりますか?
a,bというのは固定なので、仮にcというデータがあっても無視して構いません。
(答)
SELECT key,
SUM(CASE data WHEN 'a' THEN 1 END) AS a,
SUM(CASE data WHEN 'b' THEN 1 END) AS b
FROM table
GROUP BY key
ORDER BY key
;
6:NAME IS NULL
08/10/09 15:40:31
いちょーつ
7:NAME IS NULL
08/10/10 00:27:52 JpXt+XXo
SQL質疑応答スレ 6問目にて時間と分の足し算を質問した者です。
回答くださった皆様ありがとうございます。
参考にして頑張ってみます。
8:NAME IS NULL
08/10/10 00:51:42 1bc3EllS
・DBとバージョン
SQLite
・テーブルデータ
MainTable
key …
-------
002 …
014 …
034 …
105 …
SubTable
key data time …
-----------------
002 2345 1 …
002 1345 5 …
002 1123 8 …
034 4562 3 …
034 2930 9 …
105 1222 7 …
105 4850 8 …
・欲しい結果
key c1 c2
-----------------
002 0 2
014 0 0
034 1 1
105 1 2
・説明
c1はSubTableのdataが1000以上かつtimeが5以上の数。c2はSubTableのtimeが5以上の数。
MainTableを軸にしてSubTableに対応するkeyが無い場合は0を表示したいのですが、
SELECT
m.key,
coalesce( t1.c, 0 ) as c1,
coalesce( t2.c, 0 ) as c2
FROM MainTable m
LEFT JOIN
( SELECT m.key, count(*) as c
FROM subTable s
INNER JOIN MainTable m ON m.key = s.key
WHERE s.time >= 5 and s.data >= 1000
GROUP BY m.key ) t1
ON t1.key = m.key
LEFT JOIN
( SELECT key, count(*) as c
FROM subTable
WHERE s.time >= 5
GROUP BY key ) t2
ON t2.key = m.key
バインドする時に「s.time >= 5」の部分が2回出てきたり、同じようなサブクエリを
2回使ってたり…。もっとスマートな形があると思うのですが、良い解決策が見つかりません。
9:8
08/10/10 01:04:08 1bc3EllS
すみません。ちょっと間違えました。
・MainTableはoverカラムがあります。
誤:key …
正:key over …
・c1の条件は1000以上では無く、MainTable.over以上です。(1000以外の場合もあります)
誤:c1はSubTableのdataが1000以上かつtimeが5以上の数。
正:c1はSubTableのdataがMainTable.over以上かつtimeが5以上の数。
・なので、何の為にMainTableをJOINしてるかわからないSQL文になっていました。
誤:WHERE s.time >= 5 and s.data >= 1000
正:WHERE s.time >= 5 and s.data >= m.over
以上、よろしくおねがいします。
10:NAME IS NULL
08/10/10 02:39:38
>>9
SQLiteで動くかどうか未確認。
SELECT key,sum(CASE WHEN data >= over THEN 1 ELSE 0 END) AS c1 ,count(data) AS c2
FROM MainTable
LEFT JOIN
(SELECT * FROM SubTable WHERE time >= 5) AS T1 USING(key)
GROUP BY key;
--補足
c1もc2もtime>=5なので、サブクエリT1で先に抽出。
data >= over の判定はCASEで。
と言う具合に条件判定を別けてるので、実運用時の条件次第では
複雑なCASE文になるかもしれんよ。
11:8
08/10/10 11:52:55
ありがとうございます。
なるほど。sumの中にCASEですか。
そういう書き方ができるとは知りませんでした。
(まだ、SQL初めて2週間なので…)
SQLiteで無事に動きました。とても助かりました。
12:NAME IS NULL
08/10/11 08:05:59
だれか
SQLServerとOracleでの
文字列→日付
日付→文字列
をフォーマット付きで指定できる奴の
テンプレ作っておいてくれ
俺が帰ってくるまでにw
なかったら俺が探して書くw
13:NAME IS NULL
08/10/11 15:19:19
PCとActiveSync接続中のネット接続ON/OFF切り替えするメニューどこでしたか?
14:NAME IS NULL
08/10/11 15:19:51
誤爆しました。