【问题标题】:CASE statement with Absolute Values具有绝对值的 CASE 语句
【发布时间】:2017-05-17 14:36:37
【问题描述】:

即使我在表达式上使用 ABS() 函数,CASE 语句似乎也没有捕获具有负值的记录。有问题的记录是值为 -1.52 的记录,它应该在 case 语句的范围内“

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

"

任何人都可以对此有所了解吗?提前致谢! (对预期结果的格式感到抱歉)

创建包含示例数据的表的脚本:

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

我的预期结果:

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   | 

【问题讨论】:

  • 复制和粘贴时是否从代码中删除了某些内容?我在 Standard_Hours)100>25 收到错误
  • 一秒,错误检查。谢谢你顺便看看这个
  • 是的,复制粘贴有问题,现在尝试修复它
  • 我发布了一个代码链接 - 格式适合我..
  • 我找到了你的问题,检查我的答案。

标签: sql tsql


【解决方案1】:

我认为问题不在于您的案例陈述,而是标准偏差。

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

【讨论】:

  • 1.52 > 1.50 即 (2*.75)... 所以结果将是“强烈推荐评论”,但它永远不会达到这一点。问题不在于 ABS 计算,而在于第一个 CASE
  • 试试这个,将最后一个 ELSE '' 更改为 ELSE 'TEST' 并运行语句,看看你会得到什么结果。
【解决方案2】:

使用 Actual_Hours= .79 和 Standard_Hours = 1.84 的特定行值,我们计算数学并得到...

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 中。但这可能取决于您的业务逻辑。

为了全面披露我的测试方式,我将这两列添加到您的查询中:

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

这让我可以将 CASE 语句与结果进行比较并返回解决方案。

【讨论】:

  • 这很有帮助! - 非常感谢你。进行目视检查的额外列是一个好主意。我将来肯定会使用它。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-03-12
  • 1970-01-01
  • 1970-01-01
  • 2012-04-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多