2017-05-17 4 views
2

CASE文は、式にABS()関数を使用していても、負の値を持つレコードをキャッチしているようではありません。問題のレコードは、「絶対値付きのCASE文

WHEN ABS(DifferenceHours - @Mean_Diff) >1*@SD 
        AND ABS(DifferenceHours - @Mean_Diff) <=2*@SD 
        THEN 'Recommend Review' 

誰もがこの上でいくつかの光を当てることができcase文の範囲に入るべきで-1.52の値を有するものですか?前もって感謝します!問題の

CREATE TABLE [dbo].[Sample_Data](
    [ID] [char](6) NOT NULL, 
    [Actual_Hours] [decimal](38, 2) NULL, 
    [Standard_Hours] [decimal](10, 2) NULL, 
    [DifferenceHours] [decimal](38, 2) NULL 
) ON [PRIMARY] 
GO 
SET ANSI_PADDING OFF 
GO 
INSERT [dbo].[Sample_Data] ([ID], [Actual_Hours], [Standard_Hours], [DifferenceHours]) VALUES (N'490412', CAST(1.22 AS Decimal(38, 2)), CAST(0.92 AS Decimal(10, 2)), CAST(0.30 AS Decimal(38, 2))) 
INSERT [dbo].[Sample_Data] ([ID], [Actual_Hours], [Standard_Hours], [DifferenceHours]) VALUES (N'491712', CAST(1.36 AS Decimal(38, 2)), CAST(0.92 AS Decimal(10, 2)), CAST(0.44 AS Decimal(38, 2))) 
INSERT [dbo].[Sample_Data] ([ID], [Actual_Hours], [Standard_Hours], [DifferenceHours]) VALUES (N'493822', CAST(1.96 AS Decimal(38, 2)), CAST(0.92 AS Decimal(10, 2)), CAST(1.04 AS Decimal(38, 2))) 
INSERT [dbo].[Sample_Data] ([ID], [Actual_Hours], [Standard_Hours], [DifferenceHours]) VALUES (N'496762', CAST(1.51 AS Decimal(38, 2)), CAST(1.84 AS Decimal(10, 2)), CAST(-0.33 AS Decimal(38, 2))) 
INSERT [dbo].[Sample_Data] ([ID], [Actual_Hours], [Standard_Hours], [DifferenceHours]) VALUES (N'497082', CAST(2.72 AS Decimal(38, 2)), CAST(0.92 AS Decimal(10, 2)), CAST(1.80 AS Decimal(38, 2))) 
INSERT [dbo].[Sample_Data] ([ID], [Actual_Hours], [Standard_Hours], [DifferenceHours]) VALUES (N'497092', CAST(1.45 AS Decimal(38, 2)), CAST(0.92 AS Decimal(10, 2)), CAST(0.53 AS Decimal(38, 2))) 
INSERT [dbo].[Sample_Data] ([ID], [Actual_Hours], [Standard_Hours], [DifferenceHours]) VALUES (N'497162', CAST(2.06 AS Decimal(38, 2)), CAST(0.92 AS Decimal(10, 2)), CAST(1.14 AS Decimal(38, 2))) 
INSERT [dbo].[Sample_Data] ([ID], [Actual_Hours], [Standard_Hours], [DifferenceHours]) VALUES (N'498002', CAST(2.03 AS Decimal(38, 2)), CAST(0.92 AS Decimal(10, 2)), CAST(1.11 AS Decimal(38, 2))) 
INSERT [dbo].[Sample_Data] ([ID], [Actual_Hours], [Standard_Hours], [DifferenceHours]) VALUES (N'498632', CAST(0.89 AS Decimal(38, 2)), CAST(0.92 AS Decimal(10, 2)), CAST(-0.03 AS Decimal(38, 2))) 
INSERT [dbo].[Sample_Data] ([ID], [Actual_Hours], [Standard_Hours], [DifferenceHours]) VALUES (N'499162', CAST(0.79 AS Decimal(38, 2)), CAST(1.84 AS Decimal(10, 2)), CAST(-1.05 AS Decimal(38, 2))) 
INSERT [dbo].[Sample_Data] ([ID], [Actual_Hours], [Standard_Hours], [DifferenceHours]) VALUES (N'499582', CAST(1.19 AS Decimal(38, 2)), CAST(0.92 AS Decimal(10, 2)), CAST(0.27 AS Decimal(38, 2))) 

コード::私は、スタック交換のフォーマットに苦しんでいます

スクリプトがテーブル含むサンプルデータを作成する(期待される結果のフォーマットについて申し訳ありません)。私が自分のコードを貼り付けると、改行して「いくつかのアスタリスク」を取り除きます。なぜ私は考えていない。私はそれを整理しようとしている間、ここにコードを掲載しました。興味深いことに、サンプルデータを含むテーブルを作成するコードに問題はないようでした。

https://codedump.io/share/7ISZ7p8qrXvu/1


SAMPLE_DATA

私の期待される結果FROM:Actual_Hours = 0.79とStandard_Hours = 1.84我々は数学を評価し、我々が得るこの特定の行の値を使用して

ID  | Actual_Hours | Standard_Hours | DifferenceHours | Deviation | Recommendation 
490412 | 1.22  | 0.92   | 0.30   | -0.17 | 
491712 | 1.36  | 0.92   | 0.44   | -0.03 | 
493822 | 1.96  | 0.92   | 1.04   | 0.57 | 
496762 | 1.51  | 1.84   |-0.33 | -0.80 | 
497082 | 2.72  | 0.92   | 1.80 | 1.33 | Recommend Review 
497092 | 1.45  | 0.92   | 0.53 | 0.06 | 
497162 | 2.06  | 0.92   | 1.14 | 0.67 | 
498002 | 2.03  | 0.92   | 1.11 | 0.64 | 
498632 | 0.89  | 0.92   |-0.03 | -0.50 | 
499162 | 0.79  | 1.84   | -1.05| -1.52 | RecommendReview <- 
499582 | 1.19  | 0.92   | 0.27 | -0.20 | 
+0

FROMは何かを、あなたがコピーしたときにあなたのコードからストリッピングして貼り付けたのですか?私はStandard_Hoursでエラーになります)100> 25 –

+0

1秒、病気チェック。これを見てくれてありがとう – roman

+0

はい、コピー&ペーストで何かが詰まっていて、今修正しようとしています – roman

答えて

0

...

WHEN ((Actual_Hours - Standard_Hours)/Standard_Hours)* 100>25 THEN 
    CASE ... 
    ELSE '' 
ELSE '' 

計算にデータを入力:簡素化

((.79 - 1.84)/1.84) * 100 

:この値が負であるので、

(-.57) * 100 
-57 

>は25に評価されません。したがって、FIRST CASEは真ではなく、ELSE(空の文字列 '')と評価されます。 4行目と9行目でも同じ問題が発生します。

解決するには、おそらく(おそらく?)最初のCASEをABSにラップしたいと思うかもしれません。しかし、それはあなたのビジネスロジックに依存するかもしれません。

そして、私がテストした方法についての完全な開示のために、私はあなたのクエリにこれらの2つの列を追加しました:

DifferenceHours - @Mean_Diff AS CaseTestResult, 
((Actual_Hours - Standard_Hours)/Standard_Hours)* 100 AS HoursCalc 

をこれは私が結果にCASE文を比較し、その溶液に戻って働くことができました。

+0

それは多くの助けになります! - どうもありがとうございました。視覚的なチェックを行う余分な列は素晴らしいアイデアです。私は間違いなく将来それを使用しています。 – roman

0

あなたのケースステートメントが標準偏差の場合は問題ではないと思います。

SDは0.75であり、2 * 0.75 = 1.50は1ではない。52

それを試してみてください。

SELECT *   
    , DifferenceHours - @Mean_Diff AS 'Deviation'  
    , CASE             
     WHEN ((Actual_Hours - Standard_Hours)/Standard_Hours)*100>25 
      THEN   
       CASE 
        WHEN ABS(DifferenceHours - @Mean_Diff)<=1*@SD 
        THEN '' 

        WHEN ABS(DifferenceHours - @Mean_Diff) >1*@SD 
        AND ABS(DifferenceHours - @Mean_Diff) <=2*@SD 
        THEN 'Recommend Review' 

        WHEN ABS(DifferenceHours - @Mean_Diff) > 2*@SD 
        THEN 'Strongly Recommend Review' 
       ELSE '' 
       END 
     ELSE '' 
     END AS 'Recommendation' 
     ,ABS(DifferenceHours - @Mean_Diff) [ABS(DifferenceHours - @Mean_Diff) ] 
     , 1*@SD [1*@SD] 
     , 2.*@SD [2*@SD] 

SAMPLE_DATA

+0

1.52> 1.50(2 * .75)...結果は「強く推奨レビュー」となりますが、それは決してその点には達しません。問題はABSの計算ではなく、最初のケース –

+0

これを試し、最後のELSEを 'ELSE' TEST 'に変更してステートメントを実行し、結果を得るために何を得るかを確認します。 –