以下update実行しました。


update table set gakunen =
case
when ltrim(substr(uketukebi,5,2),'0') >= 4 then
case
when sotunen - substr(uketukebi,1,4) = '1' then 3
when sotunen - substr(uketukebi,1,4) = '2' then 2
when sotunen - substr(uketukebi,1,4) = '3' then 1
when sotunen - substr(uketukebi,1,4) > '3' then 0
when sotunen - substr(uketukebi,1,4) < '1' then 4
end
when ltrim(substr(uketukebi,5,2),'0') < 4 then
case
when sotunen - substr(uketukebi,1,4) = '0' then 3
when sotunen - substr(uketukebi,1,4) = '1' then 2
when sotunen - substr(uketukebi,1,4) = '2' then 1
when sotunen - substr(uketukebi,1,4) >= '3' then 0
when sotunen - substr(uketukebi,1,4) < '0' then 4
end
end
卒年と受付日から学年を割り出してセットするといったものなのですが、
こちらを実行後に、不可思議なレコードがあります。

SOTUNEN UKETUKEBI gakunen
2013 20120301074506 3
上記の学年が3となりますが、2が正解です。
なのに、なぜか3になります。
原因はなんでしょうか。

回答の条件
  • 1人5回まで
  • 13歳以上
  • 登録:2013/09/06 23:54:30
  • 終了:2013/09/08 19:13:58

ベストアンサー

id:windofjuly No.2

うぃんど回答回数2625ベストアンサー獲得回数11492013/09/07 02:18:42

ポイント100pt

明確にcastしたほうが良いでしょう。

when ltrim(substr(uketukebi,5,2),'0') >= 4 then
  ↓
when cast(substr(uketukebi,5,2) as integer) >= 4 then

when ltrim(substr(uketukebi,5,2),'0') < 4 then
  ↓
else

一発

UPDATE table SET gakunen =
min( 4, max( 0, 3 + ( substr( uketukebi, 1, 6 ) - ( sotunen * 100 + 3 ) ) / 100 ) )
他1件のコメントを見る
id:windofjuly

順に文字を当てはめて検証してください。

(0)データ準備
UKETUKEBI 20120301074506
SOTUNEN 2013

(1)年月の形にお互いを整える
substr( uketukebi, 1, 6 ) = 201203
sotunen * 100 + 3 = 201303

(2)差引して年の単位にする
( substr( uketukebi, 1, 6 ) - ( sotunen * 100 + 3 ) ) / 100 ) = (201203 - 201303) / 100 = -1.0

(3)学年を求める
3 + ( substr( uketukebi, 1, 6 ) - ( sotunen * 100 + 3 ) ) / 100 ) = 2

(4)最小値でフィルタリング(ゼロか結果のどちらか大きいほうを選択する)
max( 0, 3 + ( substr( uketukebi, 1, 6 ) - ( sotunen * 100 + 3 ) ) / 100 ) = 2

(5)最大値でフィルタリング(4か結果のどちらか小さいほうを選択する)
min( 4, max( 0, 3 + ( substr( uketukebi, 1, 6 ) - ( sotunen * 100 + 3 ) ) / 100 ) ) = 2


SQLに迷ったときは目に見える形で確認したほうが楽なので、
今回はCaleで下記のような式を作り、php+SQLite3に移植して軽くですが動かしました。
設計ミスがないか、そちらでも確認してから使ってください。
A列にSOTUNEN
B列にUKETUKEBI
C列に=MIN(4,(MAX(0,3+(VALUE(MID(B1,1,6)) - VALUE(A1&"03"))/100)))

2013/09/07 10:27:35
id:yayayai

ありがとうございました!!

2013/09/08 19:13:38

その他の回答(1件)

id:taknt No.1

きゃづみぃ回答回数13538ベストアンサー獲得回数11982013/09/07 00:12:32

when ltrim(substr(uketukebi,5,2),'0') >= 4 then

ここで取得されるltrim(substr(uketukebi,5,2),'0')は '3'となるため

'3'>=4 と比較される。

数値より文字のほうが 大きいため 最初の分岐になると思われます。

ちなみに

update table set gakunen =
case
when ltrim(substr(uketukebi,5,2),'0') >= 4 then
case
when sotunen - substr(uketukebi,1,4) = '1' then 5
when sotunen - substr(uketukebi,1,4) = '2' then 2
・・・
とかやった場合は、5になりませんか?

id:yayayai

ありがとうございます!! やりたいこととしては、受付日(uketukebi)と卒年(sotunen)から学年を算出するなのですが、なので、卒年が2014年で受付日が2013年9月7日の場合は、学年は3年生としていますので、5になるかならないかといいますと、ならないと思っています。

2013/09/07 09:48:14
id:windofjuly No.2

うぃんど回答回数2625ベストアンサー獲得回数11492013/09/07 02:18:42ここでベストアンサー

ポイント100pt

明確にcastしたほうが良いでしょう。

when ltrim(substr(uketukebi,5,2),'0') >= 4 then
  ↓
when cast(substr(uketukebi,5,2) as integer) >= 4 then

when ltrim(substr(uketukebi,5,2),'0') < 4 then
  ↓
else

一発

UPDATE table SET gakunen =
min( 4, max( 0, 3 + ( substr( uketukebi, 1, 6 ) - ( sotunen * 100 + 3 ) ) / 100 ) )
他1件のコメントを見る
id:windofjuly

順に文字を当てはめて検証してください。

(0)データ準備
UKETUKEBI 20120301074506
SOTUNEN 2013

(1)年月の形にお互いを整える
substr( uketukebi, 1, 6 ) = 201203
sotunen * 100 + 3 = 201303

(2)差引して年の単位にする
( substr( uketukebi, 1, 6 ) - ( sotunen * 100 + 3 ) ) / 100 ) = (201203 - 201303) / 100 = -1.0

(3)学年を求める
3 + ( substr( uketukebi, 1, 6 ) - ( sotunen * 100 + 3 ) ) / 100 ) = 2

(4)最小値でフィルタリング(ゼロか結果のどちらか大きいほうを選択する)
max( 0, 3 + ( substr( uketukebi, 1, 6 ) - ( sotunen * 100 + 3 ) ) / 100 ) = 2

(5)最大値でフィルタリング(4か結果のどちらか小さいほうを選択する)
min( 4, max( 0, 3 + ( substr( uketukebi, 1, 6 ) - ( sotunen * 100 + 3 ) ) / 100 ) ) = 2


SQLに迷ったときは目に見える形で確認したほうが楽なので、
今回はCaleで下記のような式を作り、php+SQLite3に移植して軽くですが動かしました。
設計ミスがないか、そちらでも確認してから使ってください。
A列にSOTUNEN
B列にUKETUKEBI
C列に=MIN(4,(MAX(0,3+(VALUE(MID(B1,1,6)) - VALUE(A1&"03"))/100)))

2013/09/07 10:27:35
id:yayayai

ありがとうございました!!

2013/09/08 19:13:38

コメントはまだありません

この質問への反応(ブックマークコメント)

「あの人に答えてほしい」「この質問はあの人が答えられそう」というときに、回答リクエストを送ってみてましょう。

これ以上回答リクエストを送信することはできません。制限について

絞り込み :
はてなココの「ともだち」を表示します。
回答リクエストを送信したユーザーはいません