declare cur cursor for select No,A from t order by No desc; declare exit handler for not found set done = 0; set done = 1; set _flag = 0; set _cnt = 0;
open cur; while done do fetch cur into _no, _a; if _a = 1 and _no > 0 then update t set b = 0 where No = _no + 1; set _cnt = _cnt + 1; else update t set b = _cnt where No = _no + 1; set _cnt = 0; end if; end while;
if _a = 1 then update t set b = 0 where No = _no; else update t set b = _cnt where No = _no; end if; close cur; end; 0324NAME IS NULL2018/05/13(日) 05:37:55.80ID:???>>322 ありがとうございます。 教えていただいたキーワードをもとに 調べてみます。
>>323 ありがとうございます。 今はPCをさわれる環境にないので月曜日に試してみたいと思います。 0325NAME IS NULL2018/05/13(日) 07:21:58.29ID:???>>322 再帰やストアドなんて要らんでしょ >>318 の結果を得たいだけなら
select T1.NO, T1.A, ( select min(T3.NO) as NO from T as T3 where T1.NO < T3.NO and T1.A <> T3.A ) - T1.NO as [連続数] from T as T1 inner join T as T2 on T1.NO - 1 = T2.NO and T1.a <> T2.a where T1.A = 1
で十分でしょ (わかると思うけど表名は T ね) 0326NAME IS NULL2018/05/13(日) 09:51:48.44ID:???>>325 ありがとうございます。 試してみます。 0327NAME IS NULL2018/05/13(日) 11:09:02.63ID:??? 再帰SQLでやるならこんな感じ 最初に1がでたところで表示したいとのことなので レコードの最後から加算積み上げてる 半角でレスしようとしたらインジョクションかなんかでエラーになった ため全角に変換してます
よろしくお願いします。 0335NAME IS NULL2018/05/17(木) 22:21:17.05ID:???>>334 で何をやりたいかはだいたいわかったけど (たぶん STARTしてからSTOPするまで KEKKAを1にすればよいはず) 行順を保持しつつ状態遷移させるのって普通のSQLでできるのだろうか? 0336NAME IS NULL2018/05/17(木) 22:27:50.57ID:??? START、START、STOP、STOPって並びになったときはどうすんの? 0337NAME IS NULL2018/05/17(木) 22:28:51.14ID:??? 334見てなかった、すまん 0338NAME IS NULL2018/05/17(木) 22:51:31.55ID:???>>334 スタートがあったら1加算ストップがあったら1減算する累積計算すればいいじゃねえ select no sum( start + end * -1) as kekka from t as m left join t as s on t.no<=m.no group by no 0339NAME IS NULL2018/05/18(金) 01:30:58.99ID:???>>338 いろいろ細かいミスは置いといて、それSTOPの行が1にならんだろ
>>329 select NO,START,STOP, (select isnull(sum(START),0) from t where t.NO <= m.NO)- (select isnull(sum(STOP),0) from t where t.NO < m.NO) KEKKA from t m とかで出来んじゃね 0340NAME IS NULL2018/05/18(金) 10:08:58.76ID:??? ありがとうございます。 皆さんに教えていただいた方法を試していますが、うまく行きそうです。 ありがとうございました。 0341NAME IS NULL2018/05/18(金) 17:13:55.57ID:??? ・DBMS名とバージョン 10.1.16-MariaDB
MySQLはよく知らんけど select code, date_format(bb_date, '%Y/%d'), sum( case baibai when 1 then -suuryou when 3 then suuryou end ) from data_pool group by code, date_format(bb_date, '%Y/%d') とかで行けるんじゃね? 0348NAME IS NULL2018/05/29(火) 14:04:09.72ID:??? date_format の所、%Y/%m だな。 2カ所直せば大丈夫だろう 03493442018/05/29(火) 14:07:06.19ID:??? 重ね重ねの間違いお恥ずかしいw 有難うございます %d を %m にして欲しい結果を得ることが出来ました。感謝 0350NAME IS NULL2018/05/31(木) 20:59:32.14ID:??? 毎日の果物の価格を記録するデータベースを作りたいんですがどういうテーブルをつくったらいいですか?とりあえずitemsテーブルに果物の種類とidのカラムを作ります。 毎日の価格はどういうテーブルにしたらいいですか? 0351NAME IS NULL2018/05/31(木) 21:13:08.20ID:???>>350
よろしくお願いいたします。 0379NAME IS NULL2018/06/24(日) 21:18:41.09ID:??? select 個人名, max(case カラム番号 when 1 then エラー end) as エラー1回目, max(case カラム番号 when 2 then エラー end) as エラー2回目, max(case カラム番号 when 3 then エラー end) as エラー3回目, max(case カラム番号 when 4 then エラー end) as エラー4回目, max(case カラム番号 when 5 then エラー end) as エラー5回目 from ( select 個人名, case when not エラーA is null then 'エラーA' when not エラーB is null then 'エラーB' when not エラーC is null then 'エラーC' end as エラー row_number() over ( partition by 個人名 order by 日付 asc, オーダ番号 asc) as カラム番号 from エラー履歴 ) group by 個人名 0380NAME IS NULL2018/06/25(月) 19:53:25.00ID:??? よろしくお願いします。 0381NAME IS NULL2018/06/25(月) 21:07:08.21ID:??? こちらこそよろしくお願いします。 0382NAME IS NULL2018/06/25(月) 22:01:22.79ID:???>>379 ありがとうございます!できました!!! どうしてこんなクエリが思いつくんですか。すげぇですね! 0383NAME IS NULL2018/06/26(火) 16:30:55.58ID:??? 質問です。 tableA id
Bの1レコードにたいして、Aの情報と、Cのcol1がnullでない数の情報が欲しいのですが、 LEFT OUTER JOINでどう書けばいいでしょうか?
SELECT t1.x, t2.x, t3.nullでない数 FROM B t1 LEFT OUTER JOIN A t2 ON t1.A.id = t2.id LEFT OUTER JOIN (SELECT COUNT(col1) AS nullでない数 FROM C WHERE Bid = t1.id) t3 ON t3.B.id = t1.id
みたいな事がやりたいのですが、クエリはエラーになってしまいます。 03843832018/06/26(火) 16:58:48.22ID:??? FROM C WHERE Bid = t1.id) t3 の部分で、「t1はここから参照できない」みたいなエラーです。 03853832018/06/26(火) 17:50:23.15ID:??? 自己解決しました (SELECT B.id, COUNT(col1) AS nullでない数 FROM C GROUP BY B.id) t3 として、WHERE句を取ればいいだけでした
無駄な検索時間は増えてしまうと思いますが・・・ 0386NAME IS NULL2018/06/27(水) 01:56:23.14ID:???>>385 カラム名を変えさせてもらった tableB id, A_id tableC B_id, col
select tableA.id, tableB.id, count(C.col) as count from tableA,tableB, (select B_id, (case when col1 is NULL then NULL else 1 end) as col from tableC) as C where tableA.id=tableB.A_id and tableB.id=C.B_id and C.c is not NULL group by A_id,C.col; 0387NAME IS NULL2018/06/27(水) 02:05:38.77ID:??? 訂正 最後から2行目
× C.c is not NULL ○ C.col is not NULL 0388NAME IS NULL2018/06/27(水) 08:42:50.79ID:???>>383 BCを先にjoinしてカウント。その結果とAをjoin 0389NAME IS NULL2018/06/27(水) 11:12:53.09ID:??? お願いします。 質問文を入力すると403 Forbiddenとなるのですが、なぜでしょう? こういう文章は入力できるのに・・・ 0390NAME IS NULL2018/06/27(水) 11:16:55.56ID:??? 再度質問を投稿してみます。
の条件のところに (条件1 AND 条件2 AND ...AND 条件10) AND (条件1 AND 条件2 AND ... AND 条件9 AND (NOT 条件10)) AND (条件1 AND 条件2 AND ... AND 条件8 AND (NOT条件9) AND 条件10) AND ... AND ((NOT 条件1) AND 条件2 AND ... AND 条件10)
と愚直に11通り書く他に、スマートに書く方法無いの? 0397NAME IS NULL2018/07/14(土) 15:48:00.68ID:??? where case when 条件1 then 1 else 0 end + case when 条件2 then 1 else 0 end ... + case when 条件10 then 1 else 0 end >= 9 0398NAME IS NULL2018/07/14(土) 16:33:57.42ID:??? なるほど、CASE式を使うのか。 サンQ
ってか質問のころ、11通りを結ぶのはANDじゃなくてORの間違いだったな。 0399NAME IS NULL2018/07/16(月) 18:50:59.75ID:XzzcYhc4>>398 複数のselect文を書いてunion allの方が意図がわかりやすいうえに、条件を変えるときも変更時のリスクも低い。 0400NAME IS NULL2018/07/16(月) 19:13:40.21ID:???>>399 ちょっと具体的に書いてみ
まともな頭持ってたら書いてる途中で顔真っ赤になると思うが… 0401NAME IS NULL2018/07/16(月) 19:16:01.66ID:???>>399 条件ちゃんと読んでないのかもしれんが、複数条件つなぐのはorだぞ ちょっとunionで書いてみてくれよ 0402NAME IS NULL2018/07/16(月) 20:50:23.35ID:??? 単純に、orでつないでる式を一つにしたsql文をunionすれば良いと思うのだが 0403NAME IS NULL2018/07/16(月) 21:32:24.07ID:???>>402 それのどこが「スマート」なんだ? 0404NAME IS NULL2018/07/16(月) 21:39:54.23ID:??? 質問者自身にしろ、CASE使った回答にしろ、 SELECT条件で9個以上の判定をしていますが、 UNION使って列挙した場合、それぞれのSELECTが 独立してテーブルをスキャンする事になるので 仮に上手く書けたとしても効率が悪いって気がします 0405NAME IS NULL2018/07/16(月) 22:51:06.23ID:5Oge9TUh>>404 それは素人の考え方です。先の例ではSQLの見た目はシンプルそうに見えますが、実際の処理コストは高いと思われます。 0406NAME IS NULL2018/07/16(月) 22:53:57.62ID:5Oge9TUh それなりにデータベースに詳しくてもいまだにSQLはこう書くと内部でこう処理されると主張する方がいますが、それはリレーショナルデータベースの根本から否定する主張です。SQLは処理方法を指定しない非構造化言語です。 0407NAME IS NULL2018/07/16(月) 23:01:38.78ID:5Oge9TUh>>404 リレーショナルデータベースはそんなにお馬鹿ではありません。SQLの発行回数を問題視したり、SELECT句が難度も出てきたり、見た目だけでコストが高い、性能が悪いと言われて仕事でもかなりの支障をきたしますのでそういった発言は控えてください。
まずは実行計画と実際にどのように処理されたかSQLをトレースして己の知識を高めてから偉そうなことを言ってください。 0408NAME IS NULL2018/07/16(月) 23:03:33.07ID:??? 後の例を提示してもらった上で性能なり効率なりを評価してみましょう 0409NAME IS NULL2018/07/16(月) 23:07:17.64ID:5Oge9TUh>>408 すぐに回答を欲しがるいつものあなたですが、ここは教育スレッドではありません。
ちなみにさきほどの非構造化とは非構造化データのことではなく、構造化定義のない言語という意味です。 0410NAME IS NULL2018/07/16(月) 23:12:29.73ID:??? 教えてもらうスレではなく、質疑応答スレです。
>402 名前:NAME IS NULL[sage] 投稿日:2018/07/16(月) 20:50:23.35 ID:??? >単純に、orでつないでる式を一つにしたsql文をunionすれば良いと思うのだが
この人がSQL書いて提示するのを待っているところですが 0411NAME IS NULL2018/07/16(月) 23:18:34.32ID:5Oge9TUh>>397 の良くない点を挙げましょう。
SQLの入門書の絵でも見て勉強してください。 0417NAME IS NULL2018/07/16(月) 23:45:50.92ID:??? この人NGにした方が良さそうですね? 0418NAME IS NULL2018/07/16(月) 23:52:58.66ID:5Oge9TUh UNION ALLでなくてもSELECTがひとつでないといけないルールがあるなら、WHERE句に10個の条件がすべて真、9個の条件がすべて真の条件をOR条件でつないでもかまいません。 0419NAME IS NULL2018/07/16(月) 23:58:36.32ID:5Oge9TUh 条件1〜条件10のうち9個以上の条件を満たすものを抜き出したい。
select * from table1 where 条件;
の条件のところに (条件1 AND 条件2 AND ...AND 条件10) AND (条件1 AND 条件2 AND ... AND 条件9 AND (NOT 条件10)) AND (条件1 AND 条件2 AND ... AND 条件8 AND (NOT条件9) AND 条件10) AND ... AND ((NOT 条件1) AND 条件2 AND ... AND 条件10)
と愚直に11通り書く他に、スマートに書く方法無いの?
↑は本人も訂正していますがORの間違いでANDと書いています。さらに本人は気づいていなかったようですが「 NOT 条件 」部分はいりません。
質問者はスマートではないと言っていますが、本人がスマートではないと見た目だけで思っているだけで、まったく悪くはありません。 0420NAME IS NULL2018/07/17(火) 05:22:06.92ID:???>>413 おれなら11個も同一テーブルからのunion allとか書いてたらアホかと思うけどな whereで11個or条件書く方がマシだわ どっちにしても、9個以上が8個以上とか7個以上とかになったらどうするんだろうね
ああ、たんに最近union覚えて使いたいだけか
理解できてないのはお前のunionに対する実行効率だよ
まあ>>397がループのネストとか俺には意味不明だから、俺を遙かに超越した理解の持ち主なのかもしれんが 0421NAME IS NULL2018/07/17(火) 06:35:01.38ID:??? 環境はそれぞれだったら、いろんな方法を試したらいいんじゃない? で、目的に一番合うもの選べば。 0422NAME IS NULL2018/07/17(火) 07:11:11.28ID:??? 効率云々の前にunion allとかにしたら重複行の扱いで結果異なるし >>417が正解かと