SELECT * FROM tableA WHERE code = 7
というSQLで以下のように表示されるのですが、
例)
id , code , name , date , 売上
1 , 7 , りんご , 2010-01-12 , 350
1 , 7 , りんご , 2010-01-07 , 250
2 , 7 , みかん , 2010-01-12 , 450
2 , 7 , みかん , 2009-05-05 , 550
それを、売上があった日の1営業日後と3営業日後のそれぞれのidの価格も取得したいと考えております。
例)
id , code , name , date , 売上 , 1営業日後売上 , 3営業日後売上
1 , 7 , りんご , 2010-01-12 , 350 , 200 , 500
1 , 7 , りんご , 2010-01-07 , 250 , 200 , 250
2 , 7 , みかん , 2010-01-10 , 450 , 500 , 300
2 , 7 , みかん , 2009-05-05 , 550 , 220 , 350
ちなみにdateはUNIXTIMEにてintでMYSQLに格納してあります。
1営業日後にしているのは、休日の関係で1日後とできないからです。
SQLの組み方は他のテーブルとの絡みがあるので、これが適しているとまでは申せませんが、
サブクエリを使った簡素な例を投稿させていただきます。
http://dev.mysql.com/doc/refman/5.1/ja/scalar-subqueries.html
SELECT T1.id, T1.code, T1.name, T1.date, T1.売上 ,(SELECT 売上 FROM tableA T2 WHERE T2.id = T1.id AND T2.code = T1.code AND T2.date > T1.date ORDER BY date LIMIT 1,1 ) AS 1営業日後売上 ,(SELECT 売上 FROM tableA T3 WHERE T2.id = T1.id AND T2.code = T1.code AND T2.date > T1.date ORDER BY date LIMIT 3,1 ) AS 3営業日後売上 FROM tableA T1 WHERE T1.code = 7 ;
※ id + code + dateでレコードがユニーク(レコードを特定できる)だと仮定。
※ スミマセンが動作確認はせず、いきなり書いてます。
はてなに対する熱意が無くなって久しいのですが、久方ぶりに覗いて見ると、
あいも変わらず私の使ったフレーズを使いまわして、回答を含まないどころか、
勝手に休日に拘った頓珍漢な投稿を繰り返しているコマッたちゃんが
出張っているようなので、ちょっと懲らしめたくなり一時的に復帰してきました(爆!)
まずはお願いなのですが、
「営業日」の定義が土日以外ではなく定休日や祝祭日も含むかどうか
わらないと回答することは難しくなりますので、必須だとご記憶ください。
不適当な回答が集まっても混乱をきたしますから、私への返信欄か、
あるいは、コメント欄を開く設定に変更してコメント欄)に、
書き加えておくことを勧めます。
情報不足で申し訳ないです。
>>「営業日」の定義が土日以外ではなく定休日や祝祭日も含むかどうか
実際のデータは株式市場を前提としているため、「土日と祝祭日以外」ということになります。
また、MYSQL 5.1 PHP 5.2という環境です。
>実際のデータは株式市場を前提としているため
それだと、12月31日や1月2・3日も除く必要があるのではないですか?
いずれにしても休日テーブルを別途設ける必要がありますが、MySQL側のデータ型を変更できないのでは、どうにもなりませんね。
>>12月31日や1月2・3日も除く必要があるのではないですか?
そうですね。年末年始も市場は開いてませんでした^^;
ただ、株式市場が開いて無い日はデータ自体も無いので、
1営業日後のデータがほしい場合、
id , code , name , date , 売上
1 , 7 , りんご , 1263222000 , 350
の「1263222000」の数値より大きく、一番近いデータの売上の数値がわかればいいのですが。
同じように、該当日より大きく、一番近いデータを5件取得できれば、1営業日~5営業日までの数値も取得できるというイメージです。
厳しいですかね?
SQLの組み方は他のテーブルとの絡みがあるので、これが適しているとまでは申せませんが、
サブクエリを使った簡素な例を投稿させていただきます。
http://dev.mysql.com/doc/refman/5.1/ja/scalar-subqueries.html
SELECT T1.id, T1.code, T1.name, T1.date, T1.売上 ,(SELECT 売上 FROM tableA T2 WHERE T2.id = T1.id AND T2.code = T1.code AND T2.date > T1.date ORDER BY date LIMIT 1,1 ) AS 1営業日後売上 ,(SELECT 売上 FROM tableA T3 WHERE T2.id = T1.id AND T2.code = T1.code AND T2.date > T1.date ORDER BY date LIMIT 3,1 ) AS 3営業日後売上 FROM tableA T1 WHERE T1.code = 7 ;
※ id + code + dateでレコードがユニーク(レコードを特定できる)だと仮定。
※ スミマセンが動作確認はせず、いきなり書いてます。
はてなに対する熱意が無くなって久しいのですが、久方ぶりに覗いて見ると、
あいも変わらず私の使ったフレーズを使いまわして、回答を含まないどころか、
勝手に休日に拘った頓珍漢な投稿を繰り返しているコマッたちゃんが
出張っているようなので、ちょっと懲らしめたくなり一時的に復帰してきました(爆!)
返信どうも有り難うございます。
うまくいきました!
拙い文章にもかかわらず理解して頂き感謝しています。
書き方はいろいろあるけど、こんな感じ。
$sqlStr = 'SQLはここに書く'; if (!$result = mysql_query($sqlStr)) { echo 'SQLの実行失敗'; } else { $sum = array(0, 0, 0); echo '<table>'; echo '<th>id</th><th>code</th><th>name</th><th>date</th><th>売上</th><th>1営業日後売上</th><th>3営業日後売上 </th>'; while($row = mysql_fetch_row($result)){ echo '<tr>'; echo '<td>' . $row[0] . '</td>'; echo '<td>' . $row[1] . '</td>'; echo '<td>' . $row[2] . '</td>'; echo '<td>' . $row[3] . '</td>'; echo '<td>' . $row[4] . '</td>'; echo '<td>' . $row[5] . '</td>'; echo '<td>' . $row[6] . '</td>'; echo '</tr>'; $sum[0] += $row[4]; $sum[1] += $row[5]; $sum[2] += $row[6]; } echo '<tr>'; echo '<td colospan="4">トータル</td>'; echo '<td>' . $sum[0] . '</td>'; echo '<td>' . $sum[1] . '</td>'; echo '<td>' . $sum[2] . '</td>'; echo '</tr>'; echo '</table>'; }
※PostgreSQL中心のため、MySQLのほうの実行環境が今はなく、
今回もノーチェックで失礼します。
当方初心者ですが、すごくわかりやすく書いて頂いて感謝です。
わたしの場合、コードがぐちゃぐちゃで偶然出来てしまっただけなので、こちらに書き換えたいと思います。
返信どうも有り難うございます。
うまくいきました!
拙い文章にもかかわらず理解して頂き感謝しています。