1

このデータベースには、次のような数値を格納するフィールドがあります。

  • 80 1/4
  • 20 1/8
  • 20
  • 36 15/16
  • 44 1/8
  • 93 7/8
  • 89 1/8

これらを合計できるように完全な 10 進数に変換しようとしています。数値から分数を抽出し、それを小数に変換してから、それを整数に追加することで、これを実行しようとしています。分子を抽出する際にいくつかの大きな問題がありました。分母は、次を使用して抽出されています。

CASE WHEN CHARINDEX('/',Fraction) > 0 THEN RIGHT(Faction,(LEN(Fraction) - (CHARINDEX('/',Fraction)))) ELSE NULL END AS [Denominator]

それが最も効率的な方法かどうかはわかりませんが、うまくいくようです。

この方法を使用して分子を引き出そうとしました:

CASE WHEN Charindex('/', Fraction) > 0 THEN LEFT(RIGHT(Fraction, Len(Fraction) - Charindex(' ',Fraction)), CHARINDEX('/',Fraction) - 1) ELSE NULL END AS [Numerator]

しかし、それは私に分数そのものを与えるだけです。SQL が LEFT 内の RIGHT に問題があるかどうかはわかりません。何もしていないように見えるか、コードがめちゃくちゃになっている可能性が高いからです。

誰にもアイデアはありますか?

ありがとう!

4

4 に答える 4

2

ほとんど正解です。渡す長さをLEFT間違って計算しています。スペースの位置を考慮する必要があります。

それ以外の

CHARINDEX('/',Fraction) - 1

長さは

CHARINDEX('/',Fraction) - CHARINDEX(' ',Fraction) - 1

全体的な式は次のようになります。

CASE WHEN Charindex('/', Fraction) > 0 THEN LEFT(RIGHT(Fraction, Len(Fraction) - Charindex(' ',Fraction)), CHARINDEX('/',Fraction) - CHARINDEX(' ',Fraction) - 1) ELSE NULL END AS [Numerator]

sqlfiddle のデモへのリンク。

于 2013-01-15T15:13:17.560 に答える
1

これはうまくいくはずです。より読みやすくするために、CHARINDEX関数をAPPLY内に移動しました

WITH Data AS
(   SELECT  Fraction
    FROM    (VALUES
                ('80 1/4'),
                ('20 1/8'),
                ('20'),
                ('36 15/16'),
                ('44 1/8'),
                ('93 7/8'),
                ('89 1/8')
            ) t (Fraction)
), Workings AS
(   SELECT  Fraction,
            WholeNumber = CAST(CASE WHEN FractionIndex = 0 THEN Fraction ELSE LEFT(Fraction, SpaceIndex) END AS FLOAT),
            Numerator = CAST(CASE WHEN FractionIndex > 0 THEN SUBSTRING(Fraction, SpaceIndex, FractionIndex - SpaceIndex) END AS FLOAT),
            Demonimator = CAST(CASE WHEN FractionIndex > 0 THEN SUBSTRING(Fraction, FractionIndex + 1, LEN(Fraction)) END AS FLOAT)
    FROM    Data
            CROSS APPLY 
            (   SELECT  FractionIndex = CHARINDEX('/', Fraction),
                        SpaceIndex = CHARINDEX(' ', Fraction)
            ) f
)
SELECT  *,
        [Decimal] = CAST(WholeNumber + COALESCE(Numerator / Demonimator, 0) AS FLOAT)
FROM    Workings
于 2013-01-15T15:16:03.580 に答える
0

ここにあなたが試すことができるものがあります:

with t as (select '80 123/456' as val)
select (case when val like '% %/%'
             then cast(left(val, charindex(' ', val)) as float) +
                  (cast(SUBSTRING(val, charindex(' ', val), CHARINDEX('/', val) - charindex(' ', val)) as float) /
                   CAST(SUBSTRING(val, charindex('/', val)+1, 100) as int)
                  )
             else cast(val as float)
        end)
from t
于 2013-01-15T15:13:17.683 に答える
0

変数をコピーして列名に置き換え、「CHARINDEX('/',Fraction) > 0」が true である case ステートメントの部分に配置するだけです。

Declare @num varchar(50) = '1004 1/3'

--      Numerator
Select  Left(Right(@num,Len(@num)-CharIndex(' ',@num)),CharIndex('/',Right(@num,Len(@num)-CharIndex(' ',@num)))-1)
--      Denominator
Select  Right(Right(@num,Len(@num)-CharIndex(' ',@num)),Len(Right(@num,Len(@num)-CharIndex(' ',@num)))-CharIndex('/',Right(@num,Len(@num)-CharIndex(' ',@num))))
于 2013-01-15T15:16:33.907 に答える