0333NAME IS NULL2018/05/17(木) 22:05:10.46ID:??? START、STOPは必ず1レコードあり、複数はない って事なら、簡単なSQLで処理できそう 0334NAME IS NULL2018/05/17(木) 22:12:42.54ID:???>>332 STARTとSTOPは複数あります。 NO順です。 NOは連番です。 STARTが1である行とSTOPが1である行は必ず交互に来て、 STARTとSTOPが同時に来ることはありません。 STARTが1の行とSTOPが1の行は続くことがあります。 STOPが1の行の直後にSTARTが1の行が来る場合もあります。 STARTが1の行の数とSTOPが1の行の数は同じです。 NO順に先頭から見ていくと、STARTが1の行は、STOPが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が正解かと 0423NAME IS NULL2018/07/17(火) 11:41:13.48ID:??? まあちゃんとnot条件書けばいちおうunionでもunion allでも同じになるんじゃね unknownになるような条件書かなきゃな 0424NAME IS NULL2018/07/17(火) 19:05:25.28ID:??? >403 どっちがスマートかと言えば、unionで繋げた方が"sql文"としてはスマートかな 0425NAME IS NULL2018/07/17(火) 20:31:21.01ID:??? 現実社会じゃクイズ解いてるわけじゃないんだから、アプリ側でやっちゃうだけ 0426NAME IS NULL2018/07/17(火) 20:40:16.91ID:???>>425 この例で アプリ側でどんなクエリ発行してどんなロジックでチェックするのか教えてくれ 0427NAME IS NULL2018/07/17(火) 21:16:08.13ID:???>>424 だからSQL書いてみろって 書いてる間に顔真っ赤になるだろ w 0428NAME IS NULL2018/07/17(火) 21:20:42.11ID:??? お前は読めるのか? 0429NAME IS NULL2018/07/17(火) 22:10:19.21ID:??? unionおじさんの次の一手は誰も言ってない要件を持ち出す、かな 0430NAME IS NULL2018/07/17(火) 22:47:07.54ID:adSOPTjX UNIONとUNION ALLはまったく別物だ。 0431NAME IS NULL2018/07/17(火) 22:50:39.33ID:adSOPTjX>>422 だから質問者のWHERE句での条件でいいのに。 なんでSQLを直すことになったらすぐにWHERE句全体が崩壊する方法を勧めるひとがいるの? 0432NAME IS NULL2018/07/17(火) 22:57:06.79ID:adSOPTjX>>422 確かにUNION ALLでは同じレコードが返ってくることには気づかなかった。