【问题标题】:SQL - Check field value for negative number and change value if negativeSQL - 检查字段值是否为负数,如果为负则更改值
【发布时间】:2013-11-15 19:43:31
【问题描述】:

我正在处理项目资源的每月小时数,并且我要求每个资源记录不能有负小时数。 (不要问)

我希望创建一个存储过程 (SQL Server) 来检查每个月的小时数,以查看记录是否有一个或多个负值。如果记录有一个或多个负值,我必须使用剩​​余的月值来抵消负值。

参考链接:SQL Fiddle

此示例记录,对于第 3 个月,它有 -48 小时。我需要使用第 1 个月和第 2 个月(各有 24 小时)来抵消第 3 个月的 -48 小时。所以第 1 个月到第 3 个月将为 0,因为第 1 个月和第 2 个月的总小时数为 +48,这将否定第 3 个月的负数。

请注意:负数可能是任何月份,抵消负数的时间可能来自一个或多个月。我们的目标是将负数小时数归零。如果没有足够的小时数来抵消负数,则每个月的小时数将设置为 0。

提前致谢!!!

【问题讨论】:

  • 在这种情况下,我可能会使用 CLR 函数并在 .NET 中完成繁重的工作。虽然您可以在存储过程中执行此操作,但这需要大量代码,我可能会使用游标、数据透视和 case 语句,而不是 SQL 查询最擅长的。

标签: sql sql-server stored-procedures


【解决方案1】:

我认为以下是您想要的,或者至少可以让您接近:

SELECT
  CASE WHEN FCST_HR1 < 0 THEN 0 ELSE FCST_HR1 END AS FCST_HR1,
  CASE WHEN FCST_HR2 < 0 THEN 0 ELSE FCST_HR2 END AS FCST_HR2,
  CASE WHEN FCST_HR3 < 0 THEN 0 ELSE FCST_HR3 END AS FCST_HR3,
  CASE WHEN FCST_HR4 < 0 THEN 0 ELSE FCST_HR4 END AS FCST_HR4,
  CASE WHEN FCST_HR5 < 0 THEN 0 ELSE FCST_HR5 END AS FCST_HR5,
  CASE WHEN FCST_HR6 < 0 THEN 0 ELSE FCST_HR6 END AS FCST_HR6,
  CASE WHEN FCST_HR7 < 0 THEN 0 ELSE FCST_HR7 END AS FCST_HR7,
  CASE WHEN FCST_HR8 < 0 THEN 0 ELSE FCST_HR8 END AS FCST_HR8,
  CASE WHEN FCST_HR9 < 0 THEN 0 ELSE FCST_HR9 END AS FCST_HR9,
  CASE WHEN FCST_HR10 < 0 THEN 0 ELSE FCST_HR10 END AS FCST_HR10,
  CASE WHEN FCST_HR11 < 0 THEN 0 ELSE FCST_HR11 END AS FCST_HR11,
  CASE WHEN FCST_HR12 < 0 THEN 0 ELSE FCST_HR12 END AS FCST_HR12
FROM 
(select 
  FCST_HR1,
  FCST_HR1 + FCST_HR2 AS FCST_HR2,
  FCST_HR1 + FCST_HR2 + FCST_HR3 AS FCST_HR3,
  FCST_HR1 + FCST_HR2 + FCST_HR3 + FCST_HR4 AS FCST_HR4,
  FCST_HR1 + FCST_HR2 + FCST_HR3 + FCST_HR4 + FCST_HR5 AS FCST_HR5,
  FCST_HR1 + FCST_HR2 + FCST_HR3 + FCST_HR4 + FCST_HR5 + FCST_HR6 AS FCST_HR6,
  FCST_HR1 + FCST_HR2 + FCST_HR3 + FCST_HR4 + FCST_HR5 + FCST_HR6
  + FCST_HR7 AS FCST_HR7,
  FCST_HR1 + FCST_HR2 + FCST_HR3 + FCST_HR4 + FCST_HR5 + FCST_HR6
  + FCST_HR7 + FCST_HR8 AS FCST_HR8,
  FCST_HR1 + FCST_HR2 + FCST_HR3 + FCST_HR4 + FCST_HR5 + FCST_HR6
  + FCST_HR7 + FCST_HR8 + FCST_HR9 AS FCST_HR9,
  FCST_HR1 + FCST_HR2 + FCST_HR3 + FCST_HR4 + FCST_HR5 + FCST_HR6
  + FCST_HR7 + FCST_HR8 + FCST_HR9  + FCST_HR10 AS FCST_HR10,
  FCST_HR1 + FCST_HR2 + FCST_HR3 + FCST_HR4 + FCST_HR5 + FCST_HR6
  + FCST_HR7 + FCST_HR8 + FCST_HR9 + FCST_HR10 + FCST_HR11 AS FCST_HR11,
  FCST_HR1 + FCST_HR2 + FCST_HR3 + FCST_HR4 + FCST_HR5 + FCST_HR6
  + FCST_HR7 + FCST_HR8 + FCST_HR9 + FCST_HR10 + FCST_HR11 + FCST_HR12 AS FCST_HR12
from RSRC_HR
where rsrc_id = '2045831579F511750') t

有点难以准确理解您想要什么,但它似乎是跨列的总和?

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2022-06-30
    • 1970-01-01
    • 2015-07-10
    • 1970-01-01
    • 2016-11-13
    • 1970-01-01
    • 2011-04-04
    • 1970-01-01
    相关资源
    最近更新 更多