sqliteで select * from test where a = '1' or a = '2' って感じで取得してるんですが、 上記のwhereで指定した条件の順番に結果がかえってこないんです。 理想としてはaが1のデータが配列の0番目の要素、2のデータが配列1番目の要素って感じに、 where句で指定した順に取得したいんです そんなことは無理なんでしょうか? ちなみにソートでは対応できない任意の順番なのでorder byでは無理です。 ちなみにunionでselect文で繋いでも、where句で指定した順番では帰ってきませんでした。 暫定対応としてselect文を一度ずつ実行して配列に入れています。
無理。
SQLって使えねーな ありがとうございました
自分の力量のなさをツールのせいにするなよ
うるせー PHP板からいちいちやってくんなカス
>>825 > order byでは無理
この決めつけが視野を狭くしてるのではないかね
>>830 その通りでした。
カラムをもう一つ増やせばできないこともないことに気づきました。
まあそのカラムにソートに必要な値を入れといて、
後でそいつをキーにソートするって方法ですけど。
でもそうするとこのキーの値もデータ更新時に毎回更新することになるから、
ちょっとなーって思ってたところです。
まあ400回ループするよりマシかもしれないのでちょっと考えてみます。
でも現状のカラムデータだけではソートは無理です。
ありがとうございました。
出来ないやつって物のせいにするよね
>>831 本気で取り出し順を工夫するときは、別に取り出し順テーブルを持たなくちゃ。
>>832 あのな
自分の力量がないことなんかわかってんだよ
ただの捨て台詞だ
黙ってろボケ
>>833 なるほど。
それいいですね
参考になりました
ありがとうございます。
ある整数型のカラムnumがあって、 その内容が、100以下の素数であるレコードだけ抜き出すために SQLを簡潔に書く方法はありますでしょうか where num=2 or num=3 or num=5 (略) num=89 or num=97 と書いてもいいんですが、 たとえば where num={2,3,5,7,11,(略),83,89,97} のようなまとめた書き方があったら教えてください
in
select id, name, email from users; というSQLがあって、idとemailはユニークだけど、nameは重複可能であるとします。 このとき、nameが重複したときは最初(または最後)に現れたレコードだけをselectすることはできますか。 DBはPostgreSQL 9です。 よろしくお願いします。
環境ないからSQL書かんけど nameでgroup byしてmin(id)とって、それと突き合わせてemail取るとかでいけそうな
>>839-841 ありがとうございます。
distinct onがいちばん簡単そうなので、これでできるかをまず検討し、
できなければ
>>4 の方法でいこうと思います。
C# SQLite 特定の列にNallがあるかどうかの判定をして、あるかないかによって0または1を返したいのですが へたれな頭で考え、ネットからコピーして、下記のように力業?で一応出来ております もっと簡単にできるものでしょうか? // 変数宣言 const string DATABASE_NAME = @"c:\test.db"; string gDataBaseFilePath = Path.Combine(Path.GetDirectoryName(Application.ExecutablePath), DATABASE_NAME); string gDataSource = "Data Source=" + Path.Combine(Path.GetDirectoryName(Application.ExecutablePath), DATABASE_NAME) + @";password=""testpass"""; int hantei = 0; // 処理 private void HanteiShori() { string sql; SQLiteCommand command; using (SQLiteConnection conn = new SQLiteConnection(gDataSource)) { try { conn.Open(); int allData = 0; int noNall = 0; // レコード数 sql = "SELECT COUNT(*) FROM testTable"; command = new SQLiteCommand(sql, conn); SQLiteDataReader reader = command.ExecuteReader(); while (reader.Read()) { string tmp = reader[0].ToString(); allData = int.Parse(tmp); } // Nall以外の数 sql = "SELECT COUNT(retuData) FROM testTable WHERE retuData is not NULL"; command = new SQLiteCommand(sql, conn); reader = command.ExecuteReader(); while (reader.Read()) { string tmp = reader[0].ToString(); noNall = int.Parse(tmp); } if (allData > noNall) { hantei = 1; } else { hantei = 0; } } catch { } finally { conn.Close(); } } }
NallってNullのことか? 普通にNullの行数数えるだけだろ select count(*) from testTable where retuData is null でダメなのか?
845 :
843 :2012/07/06(金) 00:59:36.16 ID:???
それでいけました ありがとうございます それにしてもへこむ、、、 結構がんばって検索して頭ひねったつもりでいたのにあっさりと答えて頂いた 自分で出来たときなんか「オレって天才じゃねw」とか思っていたりして しかも長文が恥ずかしい さらにNallって 精進いたします
アフリカではよくあること
格好つけて「なる」と発音してきたのはよく分かった。
俺もナルって言ってるわ。 ドイツ語だとヌルらしいな。 ゼロもヌルだそうなので、ジェームス・ボンドはドイツ語だと「ヌルヌルズィーベン」だそうな。
そしてポッカの「レモン100」は、 ツィトローネ フンダート! になるんですよ。 スレ汚しごめん。
>>835 なんだよ、SQLite スレとのマルチかよ。
851 :
NAME IS NULL :2012/07/08(日) 13:04:32.99 ID:0KdAjTTB
DB初心者です。質問させてください。 特定多数の人が利用するFacebookの投稿情報を管理するデータベースを作るとした時に、 そのデータのテーブルの作り方は、 1案. UserIDカラムのある一つのテーブルに全部入れてしまうのか 2案. ユーザー毎にテーブルを作って管理するのか では、一般的にはどちらのほうが良いとされるのでしょうか。 2案では、同じカラムのテーブルが作られるから、1案が妥当になるのでしょうか。 しかし一つのテーブルに特定多数の人のデータが入っているのはいかがなものかという気がしてます。 一ユーザーが保存する投稿データは10件くらいにする予定です。 よろしく御願いたします。
普通に案1のほうだろ。
ってスレチだな。設計スレに行け。
ユーザごとにテーブルっていう発想が素晴らしい 将来大物になるかも
DB初心者がいきなりでかい物を作ろうとするときのよくある勘違い発想じゃん
856 :
851 :2012/07/08(日) 13:55:23.74 ID:0KdAjTTB
普通は1案ですか。 スレチで且つお恥ずかしい質問でどうも申し訳ございませんでした。 ありがとうございました。
2案でやってみりゃすぐ破綻するからやってみ。
>>856 結構意味深い質問なのではないかと思う。
オブジェクト指向で育った人なら2案を考えても不思議ではない。
2案の弱点は最終的には FROM テーブル名 のテーブル名のところに
変数を持って来なくてはならなくなる。それはSQLの設計思想から外れる。
860 :
851 :2012/07/08(日) 14:52:18.70 ID:0KdAjTTB
>>857 ユーザーが増えすぎると、一々ユーザー毎のテーブルを開くのに破綻するということでしょうか。
普通はトランザクション使って大量データを更新するんですね。
>>858 はい
>>859 すごいですね。仰せのとおり会社業務では、オブジェクト指向のソフト開発がほとんどです。
オブジェクト指向とは関係ないですが、よく配列データに操作するのにハッシュ的感覚で添字使って高速アクセスしたりするので、
そのような考え方をしてたと思います。
つまりは何回もテーブルは開いたり閉じたりするなということでしょうか。
因みにSQLiteです。
>>859 > オブジェクト指向で育った人なら2案を考えても不思議ではない。
え?w
あるユーザーの投稿一覧を取得しようとしたとき どのテーブルを使うかはどうやって調べるんだよ
863 :
851 :2012/07/08(日) 15:12:04.26 ID:0KdAjTTB
>>862 ユーザー毎のテーブルなのだから、テーブル名がユーザーIDです。
そのユーザーIDはどこから引いてくるの? 何らかの検索結果で出たIDをテーブル名にしてさらにSQL発行するのか 一つのテーブルなら一発でひけるのに
>>863 ユーザマスタ(ID,名前)もユーザ毎にテーブルを作らないのか?w
866 :
851 :2012/07/08(日) 15:24:32.16 ID:0KdAjTTB
>>864-865 一つのテーブルでいいことはもうわかりましたのでそうします。
ありがとうございました。
スレ違いだってのがわからないの? 馬鹿なの? 死ぬの?
うまい回答が出来なかった時の免罪符ってか
生まれて初めてプログラミング(PHP+MySQL)やったとき、 主キーもインデックスも知らなかったから、動作を軽くするためにやったわw>キーごとにテーブル作成
生まれて初めてのプログラミングでデータベースまで使ったのか、 最近の子はすげーな。
このスレの凄いところは 普段は人の気配がほとんどないと思わせておきながら何かあると急に湧き出してくるところ
主キーって今まで設定してなかったんだけどあれなに?
ぬしキーを知らぬとは、、、
Facebookの管理にそんな必要があるかは疑問だが、個人ごとにテーブルで 管理することの面白さは、それぞれの個人を別の属性の集合、全積、関係として 管理できる点にある。設計という観点からすれば、それなりに筋が通っている。 ただ、RDBそれからRDBに起源を持つ、SQLとは折り合わない部分が多々ある のでは、ということだ。
ぬしって読むのかw しゅきーかと思ってた
>>872 そういう話をテーマにしたスレが確かあったはず。
>>876 恐怖なんとやら、っていうスレなら随分前に1000まで行って終わった。
878 :
874 :2012/07/08(日) 17:50:53.36 ID:???
ごめん直積だった。最近こんな言葉使ったことなかったもんで・・すみません。
>>874 そんな設計で筋が通っているなんて・・・恐ろしくてとても言えないわw
入庫、出庫、締め用のテーブルがあるとし、それぞれ、HEADER、DETAILがあり HEADERには、入出庫、締め番号、日付、ACTIVE(該当月Y/N)など DETAILには、アイテムと数量が入っているとします そこでDAILY MOVEMENTを作成したいのですが、 1~31のように固定ではなく、トランザクションがあった日のみ、つまり SELECT TRANS_DATE FROM (SELECT TRANS_DATE FROM INCOMING WHERE ACTIVE='Y' UNION ALL SELECT TRANS_DATE FROM OUTGOING WHERE ACTIVE='Y') T_DATE group by TRANS_DATE ORDER BY 1 でTRANS_DATE抽出しておきます 結果をREPORT WRITEとかWEBを用いずに TRANS_DATEが横方向に1行目に表され、 2行目1カラムは、アイテム、2カラム目はOPENING数量で、 3カラム以降はIN又はOUTの数量を表記したいのですが JUL/8はトランザクションがありませんので表記されていません 最後のカラムは、その月の現在までのSUMMARY JUL/7 JUL/9 JUL IN OUT IN OUT IN OUT CLOSE 3 5 3 3 8 15 みなさんなら、どうSQLを書きますか、教えてください
Stored Procedureを用いてループさせるとした場合ならどうでしょうか 特にどのSQLかは、こだわりませんが、擬似SQLコードでは、どうでしょうか? JUL JUL7 JUL9 JUL OPEN IN OUT IN OUT IN OUT CLOSE アイテム 15 3 5 3 3 8 10
>>881 まともに意見が欲しいなら、もうちょっと他人に解るように説明した方が良いんじゃね
俺様用語が多すぎるわ
SQLに「表記」はないぞ
なぜそれをカラム可変でやる必要があるのか理解できん
素直に日付ごとに行を持てば(出力すれば)良いんじゃないのか
トランザクションが毎日あるなら別ですが、1週間に2,3回とかですと、 ブランクばかりになってしまいます、ですので可変で表記する必要があります もちろんレコードが存在する日付のみを、カスケイドすれば可変になりますが それでは、知恵がないかと思いまして、SQLに経験豊かな方々は、 どのようなコーディングをされるのかを、拝見したく思いまして
>>885 >>884 は、カラム数を可変にする必要性があるのかっていってるんだが?
トランザクションが二日あったら、2行で出力すれば良いんじゃないのか?
それを表示するときにホストアプリで縦横変換すれば良いだけで
データの表示形式を決めるのはSQLの範疇ではないって言ってるんだが
>レコードが存在する日付のみを、カスケイドすれば可変
意味がわからん
日本語でおk
そもそも、これは7月の入出庫だけが入っているテーブルなのかな。 7月だけActiveにしてあるなんて考え難いし。
Activeは、その月を取り出すためためだけの目的でして、 倉庫では、お客様の都合で2重帳簿を作ることがしばしばあります つまりトランザクションDATEの年と月だけでデータ抽出すると 要望に答えれないからです。在庫があるのに、落としてある、 在庫がないのに、あるように見せるなど、各お客の要望に従って 幾つかのACTIVEのようなカラムを儲けています
後から後からどんどん条件が出てくる w
条件というか蛇足だな
本質は
>>5 のカラム数をデータに依存して決定したいという話なのに
自分で調べる奴・・・問題の本質を理解する力がある 2chで聞いて済ませる奴・・・抽象化する力がないので質問内容もわけわかめ
SQLじゃなくてRPGでも使うべきなんだろうな、ああいう人は。
SQLの代わりにグレネードランチャー使うって凄いな
oracle使っているのですが、 カンマ区切りの文字列を、カンマで分割した複数行としてSELECTできないでしょうか? SELECT * FROM (select "1,2,3,4" from dual) 〜〜〜〜〜 とかで複数行として、カンマ分割した結果がほしいです!
無理やりやるならテキストデータレベルでカンマを「 from dual union select 」で置換して select * from (select '1' from dual union select '2' from dual union select '3' from dual union 〜) みたいにする
898 :
895 :2012/07/10(火) 23:33:45.63 ID:???
ご教示ありがとうございます! テキストベースにしたりファンクションにしたりしないとやはり厳しいんですね・・・。 ファンクション形式でやってみます!
まず格納時にちゃんと複数行で格納するべき それが無理なら、ホストアプリで分解する SQLやストアドで何とかするのはとても勧められない
テーブル名:PRODUCT CODE, PRODUCT_NAME, M_Type 001,パソコン,01 002,パソコン NEC,01 003,パソコン FUJITSU,01 004,パソコン,01 005,パソコン,02 006,プリンター,03 ・・・ とあるとき @ PRODUCT_NAMEの重複するデータを抽出するにはどうしたらいいでしょうか? 001,パソコン,01 004,パソコン,01 005,パソコン,02 が出て欲しい A PRODUCT_NAMEかつM_Typeも一緒のデータを抽出するにはどうしたらいいでしょうか? 001,パソコン,01 004,パソコン,01 が出て欲しい お願いします。
GROUP BYしてHAVINGかな
DBMS:SQLite3.7.12.1(System.Data.SQLite1.0.81.0) [テーブルデータ] CREATE TABLE tblA( id INTEGER, status001 INTEGER, status002 INTEGER, status003 INTEGER, status004 INTEGER, . . . status300 INTEGER ); id |status001|status002|.... . |status300| ----+--------+--------+ +--------| 1| 0 | 0 | | 0 | 2| 1 | 0 | | 0 | 3| 0 | 0 | | 1 | 4| 0 | 1 | | 1 | 5| 0 | 0 | | 0 | 6| 1 | 1 | | 0 | 7| 0 | 1 | | 0 | 8| 1 | 1 | | 1 | 9| 1 | 1 | | 0 | 想定レコード数 50,000〜2000,000 [欲しい結果] ------------------------------------------- status001 | 4 //status001=1であるレコード数 status002 | 5 //status002=1であるレコード数 . . . status300 | 3 //status300=1であるレコード数 正規化に問題があるように思えますが これらを一度のSQLで取得出来ないでしょうか。 この結果を最も速く取得する方法を模索しています(__)
UNIONを300書けばできる
904 :
902 :2012/07/11(水) 13:27:22.01 ID:???
>>903 一例ありがとうございます。既にそちらの方法は作成済みです。
>>901 すみません知識不足のためよくわからないです。
サブクエリの部分がよくわからないです。
ggrks
>>900 select * from product group by product_name having count(*) > 1;
かな。試してないけど。
>>900 @
select *
from PRODUCT T1
where exists (
select *
from PRODUCT T2
where T1.CODE <> T2.CODE
and T1.PRODUCT_NAME = T2.PRODUCT_NAME
)
;
A
select *
from PRODUCT T1
where exists (
select *
from PRODUCT T2
where T1.CODE <> T2.CODE
and T1.PRODUCT_NAME = T2.PRODUCT_NAME
and T1.M_Type = T2.M_Type
)
;
>>902 >>903 に一票
それか結果を
status001|status002|.... .|status300|
--------+--------+ +--------|
4| 5| | 3|
で得てからアプリ側で縦横入れ替えるか
テーブル作りなおすべき
【質問テンプレ】 ・SQLite3 ・テーブル id,unixtime 100001,1341404056 100001,1341997094 100001,1341987930 100002,1341997860 100002,1341989037 ・欲しい結果 100001,1341997094 100002,1341997860 ・説明 上記テーブルでid毎にunixtimeが一番大きいデータを1つだけ取り出すには どのようなクエリでできるでしょうか。1回では無理でしょうか。
select id,max(unixtime) from hoge group by id order by id;
913 :
911 :2012/07/12(木) 11:53:58.76 ID:???
すみません、情報不足でした。テーブルにはテキスト情報もあり、
id,unixtime,value
"1" "1341404056" "内容1"
"1" "1341997094" "内容2"
"1" "1341987930" "内容3"
"2" "1341997860" "内容1"
"2" "1341989037" "内容2"
このような場合に
>>912 さんに教えていただいた
select id,max(unixtime),value from t_test group by id order by id
とすると、
"1" "1341997094" "内容3"
"2" "1341997860" "内容2"
と内容がずれてしまうのですが、
こういった場合では、
"1" "1341997094" "内容2"
"2" "1341997860" "内容1"
と出すにはどうしたらよいでしょうか。
>>913 それだと副問い合わせになるな
(id,unixtime) がユニークだとして
select t.id,t.unixtime,t.value from t_test t,
(select id,max(unixtime) as unixtime from t_test group by id) tmp
where t.id=tmp.id and t.unixtime=tmp.unixtime
order by t.id;
915 :
911 :2012/07/12(木) 12:25:38.43 ID:???
>>914 神様ありがとうございます!出来ました!
916 :
902 :2012/07/12(木) 13:38:28.50 ID:???
ご意見ありがとうございます!
>>909 検討してみます。
>>910 status群を子テーブルにするのが正しい姿のような気がします。
代わりにエクセルとかでささっと編集するのが面倒になるけどね
918 :
NAME IS NULL :2012/07/17(火) 22:22:45.76 ID:Di4GcY9V
・DBMS名とバージョン MySQL5 ・テーブルデータ name (verchar) abc040 abc100 abc90 abc20 abc1000 ・欲しい結果 nameはユニーク abcは固定、そのあとに数値文字列 ソートして、数値文字列の大きい順に抽出したい abc1000 abc100 abc90 abc040 abc20 ・説明
4文字目以降をゼロ詰めしてソートすればいいな。
4文字目以降の文字列を作る 左側を0でトリムする その値で降順ソートする
ご意見ありがとうございます! ちょっと難しそうですね。
ABCが固定であれば、 order by カラムdesc; じゃ駄目なの?
4ケタ目以降で、ゼロ埋めじゃなくて、数字変換する方が良いと思うんだが つかまあテーブル定義やり直すべきだろう カラムは最小単位で定義するのが鉄則
>>922 それだと
abc90
abc20
abc1000
abc100
abc040
こうなるよ
>>918 SELECT * FROM table ORDER BY CAST(TRIM(LEADING 'abc' FROM name) AS SIGNED INTEGER);
・バージョン MySQL5.5 ・テーブルデータ time (TIME), num1 (INT), num2 (INT) 00:00:00, 1, 0 00:00:10, 2, 0 00:00:20, 3, 2 00:00:30, 4, 3 00:00:40, 5, 3 ・欲しい結果 00:00:20, 3, 2 00:00:30, 4, 3 00:00:40, 5, 3 ・説明 time(時刻)が新しい(最近の)方から3行ぬきだし、 timeが昇順になるように並べます。 SELECT文でうまいことできないでしょうか。 よろしくお願いします。
>>927 ↓俺が使ってるもの(銘柄コード指定で最新データ10日分のを抜き出し
日付の昇順で表示するもの
select * from
( select vdate,sp,hp,lp,cp ,vol
from daily_sp_tbl where sc=5401 order by vdate desc limit 10 ) t
order by vdate;
そちらの名称に合わせて書き換えてみたら
ゴキ光線のお小言が始まるでぇ〜( ´Д`)y━・~~
・DBMS名とバージョン SQLite3 ・テーブルデータ tbl1 tid(auto), name(text) tbl2 tid(int), sid(int) tbl3 sid(auto), tag(text),type(int) ざっとこんな感じでnameに対して複数のタグを持っている といった感じのテーブルに対して、データを入れたいと思っています。 で、バックアップがCSVで「name,tag...」という形式で大量にあるのですが、 タグテーブルに無ければ追加、名前テーブルに追記、連結データを追加、 と手数が思ってた以上に多いので、 挿入の手数をもう少し減らせる手段とかありませんか?
何言ってんのか分かんない
SQLの質問がありまして、書きます。 Aテーブル A B C 1 11 2 22 3 33 Bテーブル A B C 4 44 1 5 55 2 6 66 欲しい結果 A B 1 44 2 55 3 33 6 66 BテーブルのCがAテーブルのAと一致したらBテーブル参照したいですが、A項目のみ値をAテーブルの値にしたいです。 何かアドバイスお願いします。。。。。 調べても、よくわからなかったので。。。 お願いします。。。
>>932 欲しい結果の(3,33)と(6,66)を考えなければ
select A.A, B.B from A,B where A.A=B.C;
で簡単なんだが、下の二行はどういう条件で抽出されるべきなの?
>>933 そうなんですね。。。
BテーブルのCに一致しないものを表示させたいです。。。。。。。
AテーブルのAとBテーブルのBはかぶらないのか? AとBをUNIONして、BをOUTER JOINしてCASEでNULL判定かな
こういうことじゃないの? select case when A.A is null B.A else A.A end as A, case when B.B is null A.B else B.B end as B, from A full outer join B on A.A = B.C
大変ありがとうございました。 みなさんのおかげで、無事にできました。
>>936 > case when A.A is null B.A else A.A end as A,
なんで、coalesce(A.A, B.A) 使わないの?
939 :
NAME IS NULL :2012/07/24(火) 06:22:52.28 ID:Gfkf5V7p
初心者用が見つからなかったのでこちらで質問します テーブル tbl |-----INDEX----|--DATA--| yyyy mm dd no item 2012 01 05 005 itemAA 2012 01 05 007 itemAC 2012 01 05 009 itemBB 2012 01 10 001 itemBA 2012 01 10 007 itemFG 2012 01 12 006 itemQW : : 結果 2012 01 10 001 itemBA 2012 01 10 007 itemFG この場合 select * from tbl where yyyy='2012' and mm='01' and dd='10' このようにnoを指定しないと検索時にインデックスは有効とならないのでしょうか? インデックスはその項目全てをSQLに明記しないと有効とはならないのでしょうか? 初歩的すぎる質問だと思いますがお願いします
sage忘れました 申し訳ないです
インデックスってこのスレで取り扱ってたっけ
オプティマイザ次第。
>>938 DBMS名書いてないから
>>939 普通のインデックス構造をもつ普通のDBMSなら普通は有効となる
ただしどんな状況でも必ずそうだとは言い切れないので
実機でアクセスパスを確かめること
(確かめる方法はDBMS固有なのでスレ違い)
オプティマイザ以前に、そのDBMSでその手の検索にインデックスが有効かどうかが問題 今時のDBMSなら効くと思うけど、まずはDBMSのマニュアルで確認するべきだな そのうえで実際の読み込みにインデックスが使われるかどうかはオプティマイザ次第 つか初心者ならまずちゃんとマニュアル読めよと
・DBMS名とバージョン MySQL 5.1 ・テーブルデータ CSVファイル "犬","シベリアンハスキー" "猫","マンチカン" "熊猫","レッサーパンダ" ・欲しい結果 インポートして、次のようにしたい、要するに連番をつけたい ID 動物 種類 1 犬 シベリアンハスキー 2 猫 マンチカン 3 熊猫 レッサーパンダ ・説明 インポートするときにdefaultをつければいいのですが、SQL文で書けないでしょうか。
MySQLならAUTO_INCREMENTあるだろ
すると次はレコード消した時にIDが虫食い状態になるのでなんとかしたい…とかの質問が来るんだな w
>>946 そうなんですが、csvのデータをいじらずにSQLのload data infile文で
なんとかならないかと思ったのですが
誰がいじれなんつった?両方使えよ
そんなんSQL92の範囲にあったっけ?
951 :
939 :2012/07/24(火) 22:28:35.43 ID:???
>>941-944 MySQL 5.5 と ACCESS2003です
オプティマイザ及びアクセスパスについて調べてみることにします
レスありがとうです (_ _)
>>943 > DBMS名書いてないから
そんなこと言うなら、case もダメだろ。
Access かも知れないんだし。
前提書いてないなら、SQL-92 あたりを想定してもいいと思うんだが。
MySQL5.1 セール価格表(P) 商品CD 適用日 単価 aaa 2012-08-01 2500 aaa 2012-08-20 3000 bbb 2012-08-01 10000 bbb 2012-08-15 8500 予約表(Y) 商品CD 購入日 数量 aaa 2012-08-01 2 aaa 2012-08-05 3 aaa 2012-08-25 1 bbb 2012-08-13 4 bbb 2012-08-19 5 ほしい表 aaa 2012-08-01 2 2500 aaa 2012-08-05 3 2500 aaa 2012-08-25 1 3000 bbb 2012-08-13 4 10000 bbb 2012-08-19 5 8500 購入日時点で適用日以降の単価が反映された表を得るにはどうしたらいいでしょうか
>>953 SELECT
商品CD,
購入日,
数量,
(SELECT 価格 FROM セール価格表 WHERE セール価格表.商品CD = 予約表.商品CD AND セール価格表.適用日 < 予約表.購入日 ORDER BY 適用日 ASC LIMIT 1) AS 価格,
FROM
予約表
みたいのでいけない?
思いつきで確認してない上に普段こうならんように組んじゃうから間違っているかもだけど。
あと、もっと効率のいいのがると思うけど。
予約表に単価を持たせる 冗長だけど我慢する
>>954 下記のように少し直しましたら、動きました・・☆。
ありがとうございました。
SELECT
商品CD,
購入日,
数量,
(SELECT 価格 FROM セール価格表 WHERE セール価格表.商品CD = 予約表.商品CD AND セール価格表.適用日 <= 予約表.購入日 ORDER BY 適用日 DESC LIMIT 1) AS 価格,
FROM
予約表
>>955 セール価格表には単価だけでなく、期間立てで持っているフィールドがあるんです。
>>956 決して効率よくないはず。
可能であれば、ホスト言語側でマージして
DB側に負担かけないようにしたほうが後日幸せになれるはず。
MySQL 5.1です。 テーブル1 15:30:20 カツ丼 15:35:40 天丼 15:50:15 他人丼 テーブル2 15:30:30 400円 15:35:45 550円 15:51:00 480円 というテーブルがあって、テーブル1と2の時刻が近いものをマッチさせて 15:30:20 カツ丼 400円 15:35:40 天丼 550円 15:50:15 他人丼 480円 のような結果を出したいのですが、どのようにすればいいでしょうか。 よろしくお願いします。
夏休みだからかな。
なんかの設問ぽいのが来ているな。
>>959 UNIX_TIMESTAMP()とABS()使って最も差分が最小値のを取り出せばいいんじゃないかな。
これ以上は、
>>4 見て質問書き直して。
UNIXTIME_TIME
>>959 ごめん。
TIME_TO_SEC()だわ。
963 :
NAME IS NULL :2012/07/27(金) 10:17:32.88 ID:KIhgtPiw
・DBMS名とバージョン SQLite3 ・テーブルデータ テーブル名 directory folder val /contact/ index /test/ connect /example/ foo /hoge/ bar /fuga/ com ・欲しい結果 問い合わせ内容とfolderの内容が部分一致していればvalを返す /contact/ にアクセスがあった場合はindexを返す /contact/foo の場合もindexを返す ・説明 $folder_hensuu = "%/contact/%"; select * from directory WHERE folder LIKE $folder_hensuu とした場合はヒットするが $folder_hensuu = "%/contact/hogehoge%"; の場合はヒットしない。 この場合はどうすれば一致判定が出来るようになりますか?
SQLite3はよくわからないんだけど、なんか逆にすべきな気がする。 つまり、部分一致する際にそのWHEREの基準となるのがfolderカラムのほうでしょ。 だから、カラムのほうに文字列結合でみたいにすればいいんではないでしょか。 MySQLしか出来ないのでこれ以上は申し訳ない…。 MySQLで書くとこんな感じ。 SELECT val FROM test WHERE '/connect/hogehoge' LIKE CONCAT('%',folder,'%');
休憩時間が設定されているときに、指定日時より'HH:MM'後の時刻を求めたいです。 ・データベース:PostgreSQL 8.4 ・テーブル: 休憩時間 開始時刻 終了時刻 08:00 08:30 19:00 19:30 22:00 22:30 使うかどうかわかりませんが、次のマスタもあります。 カレンダー 日付 ... 2012-07-26 2012-07-27 2012-07-28 ... ・説明 指定した日時から休憩時間を除いた'HH:MM'後を計算します。 計算結果が休憩時間内(開始終了時刻を含む)の場合は、休憩時間終了時刻を結果とします。 ・欲しい結果 '2012-07-27 09:00'の'09:00'後 => '2012-07-27 18:00'(休憩時間がないのでそのまま足す) '2012-07-27 09:00'の'10:00'後 => '2012-07-27 19:30'(10時間後は19:00の休憩と重なるので、19:30が答え) '2012-07-27 09:00'の'11:00'後 => '2012-07-27 20:30' '2012-07-27 09:00'の'13:00'後 => '2012-07-27 23:00'(19:00〜と22:00〜の二回の休憩を挟む)
>>965 確かに難問だ。
何を聞かれているのか説明を見るとすさまじく混乱する。
つまり、
1.出勤時刻と実労時間数を入力されたら
2.休憩時間を実労時間からはずした上で
3.勤務終了予定時刻を出力しろ。
4.ただし、終了予定時刻が休憩時間内である場合は、休憩終了時刻を出力する
ってこと?
それだけだと、欲しい結果のその日付の存在理由がなんなのかわからなくなるけど。
入力されるデータの例を出して。
ただし、ちゃんとフォーマットした形でね。
968 :
967 :2012/07/27(金) 16:31:53.50 ID:???
ごめん、1〜4を踏まえた上で例を考え直してってことでお願いします。 おそらく最後の例のままでいいんだろうけど ちょと日本語読み直してたら混乱してきてた。
>>967 私は出題者ではないのですが、
次の休憩開始時刻 - 一つ前の休憩終了時刻 = 就業時間 とすると
後・時間からこの就業時間を切り取って行く問題ですね。
さらに最後の休憩時間の後の就業時間をどう表現するかなど、
考えどころの多い問題のようです。
970 :
965 :2012/07/27(金) 18:19:05.67 ID:???
すみません。ちょっと欲張りすぎました。問題を一段階簡略化します。 休憩時間がマスタに設定されているとき、「与えられた日時」から実働9時間後の日時を求める。 (※)実働とは、休憩時間を除いた勤務時間。 この結果は、残業届けを出すときの残業開始日時を計算するときに使います。 (その後、月締め処理で残業届けに基づいて残業時間合計を計算します。) 「与えられた日時」は、未来の日付の残業届けを出すときは定時開始時刻(例えば09:00)になり、 過去の日付の残業届を出すときは、遅刻をしていればその日時になります。 例えば、'2012-07-27 09:00'と'09:00'という即値を使ったクエリで、 '2012-07-27 18:00'が計算 できるでしょうかというのが質問です。 勤務している時間を'+'、休憩時間を'_'で表すと、一日は、 ++++++___++++++__+++_++_++++ みたいに表せて、任意の開始日時(下の*)から9時間後を求めたいということです。 +*++++___++++++__+++_++_++++ +++*++___++++++__+++_++_++++ うまく説明できたでしょうか?
971 :
965 :2012/07/27(金) 18:28:24.50 ID:???
>>969 そう、その通りです。
Excelでイメージするなら、休憩時間と勤務時間の累計をして、目視で判断すればすぐに
わかりそうな問題なんですが、クエリでできないものかと…。
最も好ましいのは、一つのクエリで結果を計算できること、
次に好ましいのは、ワークテーブルを使わずにPostgreSQLのFunctionで計算できること。
最悪はワークテーブルに「実休憩時間」を展開して、複数ステップを踏んで計算するか、
Functionを再帰呼び出しして(できるのだろうか)結果を求めるか、クライアントアプリ側で
ゴリゴリやるかになると思います。
いやそれ、SQLでゴリゴリやる内容じゃないと思うぞ。
休憩時間じゃなくて、実働時間をもたせたら 実働時間のサマリが指定時間を超える最大のものとかで求まらんかな
データベース:MySQL 5.1 ストアドファンクションを作成しているのですが、 ストアド内ではGetDate()は使用できないのでしょうか? また、何か代替のものはあるのでしょうか? 初歩的な質問で申し訳ありません。
WHERE句の(+)ってどういう意味なのですか? ぐぐっても出なかったもので(^_^;)
Oracleだと外部結合演算子でググれ 他は知らん
Oracle方言でしょ、それ
979 :
965 :2012/07/30(月) 11:43:54.03 ID:???
やはり簡単にはいかないようですね。
休みの間も考えたのですが、どうもうまくいかないので、結局、ワークテーブルを使って、
Excelでやるような累計をしながら、Functionで実装することにしました。
方針は、
>>973 さんの方法です。
考えて下さった方、ありがとうございました。
980 :
NAME IS NULL :2012/07/31(火) 12:36:18.52 ID:RZdi1fDI
・Microsoft SQL2012を使っています。ちょっと質問なのですが テーブル作成時における検査制約で、とある列の列名の長さ が”6文字以内”という可変長の条件にしたいのですがどのよう に書けばよいのでしょうか? CONSTRAINT CK_stor_id CHECK(stor_id >=6 )) 上記では間違いでしょうか?よろしくお願いします。
なぜ試して見ないの?
間違いだろうね。
列名の長さ?
・SQL Server2008R2Express テーブルデータ ・2012-08-01 11:35:00, りんご, 1 ・2012-08-01 16:22:00, みかん, 2 ・2012-08-02 13:54:00, りんご, 2 ・2012-08-02 14:32:00, りんご, 1 ・2012-08-04 16:22:00, みかん, 3 ・欲しい結果 2012-08-01 2012-08-02 2012-08-04 ・説明 件数に関係なく売り上げがあった日だけのリストが欲しいのですが うまい方法あるでしょうか
distinct と having count(*)>1
ごめん間違えた distinct でいい
データベース:MySQL 5.2 table bbs( uid INT, rid INT, text TEXT ); table users( id INT UNIQUE, name VARCHAR(32) ); 欲しい結果のイメージ uid, rid, uid.name, rid.name .name は users テーブルの name の項目 掲示板で、投稿者ID (uid) と 返信先ID(rid) のそれぞれの名前を users から取得したいです。
bbsテーブルにusersテーブルを2回JOINするだけだろ
>>984-986 dateをformatかけて日付だけ取り出したいんじゃないかな?
Transaction-SQLわからなかったのでレスできなかったけど。
>>987 それぞれのID用にusersテーブルを別名つけて2回JOIN
やってみてダメだったら、作ったSQL文張ってみて
>>988-989 SELECT a.id, a.name, b.id, b.name, bbs.text FROM bbs LEFT JOIN users AS a ON bbs.uid=a.id LEFT JOIN users AS b ON bbs.rid=b.id;
a とか b とかっていう名前はともかく、これでなんとか取得出来ました。
ありがとうございます m(_ _)m
(bbs にあるデータは全て取りたいので INNER ではなく LEFT にしました)
こう言った文が長くなったときに、他の言語の様にブロックで囲むと言った記述は出来ないのでしょうか?
それとも可読性を求める時は改行で分けるのが一般的なのでしょうか?
改行とインデント使うのが一般的かと
よくやる人は
>>990 のSQL使うと
SELECT
a.id,
a.name,
b.id,
b.name,
bbs.text
FROM
bbs
LEFT JOIN
users AS a
ON
bbs.uid=a.id
LEFT JOIN
users AS b
ON
bbs.rid=b.id
;
くらいやる
( ´_ゝ`)フーン
>>991 これは改行しすぎだろ。
select みたいに、フィールド名がずらずら続く奴はべつにして
キーワードと関連するオペランドは基本的に同じ行にしといたほうが読みやすいと思うぞ。
俺ならこんな感じ。
SELECT
a.id,
a.name,
b.id,
b.name,
bbs.text
FROM bbs
LEFT JOIN users AS a ON bbs.uid = a.id
LEFT JOIN users AS b ON bbs.rid = b.id;
なるほど プログラムから使うときは SQL 文を複数に分けて連結してたけど、 改行で分けて書いた方が見た目分かりやすいですね。
>>993 俺もこんな感じで書くな
どうでもいいが俺はアプリのソースに直接SQLを埋め込む実装は好きじゃない。
SQL文は別のファイルにして、アプリからそれを読み出してwhere句の部分とかをアプリから変数で置換するのが好きだな。
アプリもSQLも仕変や改修も管理も楽になる。
と言っても元々NEとかSE出身でアプリやDBは素人のお馬鹿さんなんだがw
>>994 あと、DBMS によってはキーワードなんかの間違い箇所を行で教えてくれるものがあるから、
長大な SQL を書く時はデバッグが楽。
SELECT col1, col2 FROM ( aTab INNER JOIN bTab ON aTab.id = bTab.id ) INNER JOIN cTab ON cTab.id = aTab.id すごく人によって差がありますなぁ…。
1000
1001 :
1001 :
Over 1000 Thread このスレッドは1000を超えました。 もう書けないので、新しいスレッドを立ててくださいです。。。