SQL質疑応答スレ 7問目at DB
SQL質疑応答スレ 7問目 - 暇つぶし2ch1:NAME IS NULL
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
誤爆しました。


最新レス表示
レスジャンプ
類似スレ一覧
スレッドの検索
話題のニュース
おまかせリスト
オプション
しおりを挟む
スレッドに書込
スレッドの一覧
暇つぶし2ch