2017-01-31 9 views
0

計算のためのケース・ステートメントを持つOracleデータベース用のSQLを作成しています。現在のメソッド '1'のようにすべての整数を与えるわけではないので、NBR_UNITS/STD_PACK_QTYが整数の場合は 'Case pick'、10進の場合は 'Unit Pick'と言うことができる方法を探しています。以下はケース整数/非整数を識別するステートメント

SQLの部分は、それが今立っているである:以下

CASE 
WHEN (NBR_UNITS/STD_PACK_QTY) like '1' THEN 'Case Pick' 
WHEN (NBR_UNITS/STD_PACK_QTY) < '1' THEN 'Unit Pick' 
ELSE 'Error' 
END "Case Picks" 

データの一例です。除算計算が整数であればSQLに「Case Pick」を出力させ、小数点であれば「Unit Pick」を出力しようとしています。

Data Set

ありがとう! IS

+0

あなたは何を解決しようとしていますか?サンプルデータと期待される出力を見せてください。 \t [** How-to-Ask **](http://stackoverflow.com/help/how-to-ask) \t \t [**スタート**] (http://spaghettidba.com/2015/04/24/how-to-post-at-sql-question-on-a-public-forum/)質問品質を改善し、より良い回答を得る方法を学ぶことができます。 –

+1

その分数が1.3の場合、結果はどのようになりますか?あなたの現在の思考には "エラー"があります。 – mathguy

+0

もしそれが小数であれば、出力は 'Unit Pick'でなければなりません。整数であれば 'Case Pick'でなければなりません。 –

答えて

1

この具体例の最も簡単な解決策は、MOD関数の使用です。

CASE 
WHEN MOD(NBR_UNITS,STD_PACK_QTY) > 0 THEN 'Case Pick' 
WHEN MOD(NBR_UNITS,STD_PACK_QTY) = 0 THEN 'Unit Pick' 
END "Case Picks" 
+0

またはそれ以外の方法です。それ以外にも、これは最も効率的な答えです。 – mathguy

1

任意の数値表現xが整数であるかどうかをチェックするための標準的な方法は、

case when x = round(x) then ... 
    when x < 1  then... 
    else     ... end as .... 

(1に比較することは正しいことであると仮定すると、それがわからない、私はコメントで明確化の質問を元の投稿の下)。

0

分割をトランク/フロア/ラウンドダウンの分割と比較します。

WHEN (NBR_UNITS/STD_PACK_QTY) = TRUNC(NBR_UNITS/STD_PACK_QTY) THEN 'Case Pick' 

なく、あなたのルールはあなただけの他のすべてをキャプチャするELSE使用できるかどうかが何であるかを確認してください - ケースの数量が24であり、彼らはあなたに36を与える場合、すなわち、それは大丈夫でしょうか?もしそうなら、ELSEは基本的に他のものをキャプチャします。それが大丈夫ではなく、ユニットの数量が<24の場合にのみ、ELSE (NBR_UNITS/STD_PACK_QTY) < 1が機能し、ELSEにエラーが発生する可能性があります。

0

整数が9を超えているので、TRUNC()関数を考慮する必要があります。結果の小数部分を削除します。したがって、TRUNC(Result)がResultと等しい場合、Resultは整数です。

WITH 
    "Data" AS 
     (
      SELECT 1 AS NBR_UNITS, 8 AS STD_PACK_QTY FROM dual 
      UNION 
      SELECT 2 AS NBR_UNITS, 8 AS STD_PACK_QTY FROM dual 
      UNION 
      SELECT 3 AS NBR_UNITS, 8 AS STD_PACK_QTY FROM dual 
      UNION 
      SELECT 4 AS NBR_UNITS, 8 AS STD_PACK_QTY FROM dual 
      UNION 
      SELECT 5 AS NBR_UNITS, 8 AS STD_PACK_QTY FROM dual 
      UNION 
      SELECT 6 AS NBR_UNITS, 8 AS STD_PACK_QTY FROM dual 
      UNION 
      SELECT 7 AS NBR_UNITS, 8 AS STD_PACK_QTY FROM dual 
      UNION 
      SELECT 8 AS NBR_UNITS, 8 AS STD_PACK_QTY FROM dual 
      UNION 
      SELECT 9 AS NBR_UNITS, 8 AS STD_PACK_QTY FROM dual 
     ) 
SELECT 
    NBR_UNITS 
    ,STD_PACK_QTY 
    ,NBR_UNITS/STD_PACK_QTY  AS "Ratio" 
    ,CASE 
     WHEN (TRUNC(NBR_UNITS/STD_PACK_QTY) = NBR_UNITS/STD_PACK_QTY) THEN 'Case Pick' 
     WHEN (TRUNC(NBR_UNITS/STD_PACK_QTY) < 1)     THEN 'Unit Pick' 
     ELSE            'Error' 
    END      AS "Case Picks" 
FROM "Data" 
;