请求了SQL IF类型逻辑帮助

时间:2018-11-16 21:19:25

标签: sql sql-server

我有一个SQL问题,已经坚持了好几天。这就是上下文。我在一家有时间表的公司工作。每个时间表都有一个ID,但它不是唯一的,因为员工可能有两个具有相同ID的时间表。区别在于,通常在您提交工作表时,您的状态为“已发布”。但是,有时人们会搞砸他们的条目,并且必须通过更改将其重新提交。因此,状态为“已调整”。

我需要的逻辑如下

-时间表ID只有一个值(计数= 1)时,始终使用“已发布”状态。如果只有一个值而不是“已发布”,则返回一个错误字符串,提示“错误”。

-时间表ID具有多个值,并且“已发布”和“已调整”都显示为状态,始终默认为“已调整”。在此必须同时发布和调整。

我尝试了大小写和子查询,但是没有运气。我还有一列“时间表发布日期”,逻辑上最早的日期总是发布的,后来的日期总是“调整的”,但是在某些情况下发布日期是相同的。

如您所见,我需要查看一列中的重复计数,然后从另一列中选择该计数> 1的值。

    SELECT t1.[Resource NUID]
      ,t1.[Timesheet ID]
      ,t1.[Timesheet Start Date]
      ,t1.[Timesheet End Date]
      ,t1.[Timesheet Posted Date]
      ,t1.[Timesheet Status]
      ,t1.[RunSourceID]
      ,t1.[SpanStartDate]
      ,t1.[SpanEndDate]


    FROM [TIME_DW].[dbo].[Timecard_Timesheets]  as t1, [TIME_DW].[dbo].       [Timecard_Timesheets] as t2


   where t1.[Timesheet ID]=t2.[Timesheet ID]
   and t1.[Resource NUID]='e066308' and t1.[Timesheet Status]<>'Open' and t1.[Timesheet Status]<>'Submitted' 
 group by
 t1.[Resource NUID]
      ,t1.[Timesheet ID]
      ,t1.[Timesheet Start Date]
      ,t1.[Timesheet End Date]
      ,t1.[Timesheet Posted Date]
      ,t1.[Timesheet Status]
      ,t1.[RunSourceID]
      ,t1.[SpanStartDate]
      ,t1.[SpanEndDate]
  order by t1.[Timesheet Start Date] asc

这是具有两种状态的实际记录的示例

enter image description here

谢谢

3 个答案:

答案 0 :(得分:0)

我期望这样的逻辑:

select timesheet_id,
       (case when count(*) = 1 and min(status) = 'Posted' then min(status)
             when count(*) = 1 then 'Error'
             when min(status) = 'Adjusted' and max(status) = 'Posted' then 'Adjusted'
             else NULL  -- this case is not covered in the description
        end) as new_status
from [TIME_DW].[dbo].[Timecard_Timesheets]
group by timesheet_id;

我不理解问题代码中的所有其他列。

答案 1 :(得分:0)

这应该使您朝正确的方向前进:

首先,我们通过TimeSheet IdCN)对行进行计数,然后首先分配一个row_numberRN),并按“ Adjusted”记录进行排序,然后再分配其他所有内容(您可能希望将调整日期添加为第二顺序,以便首先获取最新日期。

然后,如果第一行和唯一行不是“已发布”的Status,我们将添加错误状态。

最后,我们仅选择WHERE RN=1

DECLARE @TimeSheet TABLE (Id INT, Status VARCHAR(15))

INSERT INTO @TimeSheet (Id,Status)
VALUES
    (1,'Posted'),
    (2,'Posted'),
    (2,'Adjusted'),
    (3,'Adjusted')

;WITH X AS
(
    SELECT COUNT(2) OVER(PARTITION BY Id) AS CN,
           ROW_NUMBER() OVER(PARTITION BY Id ORDER BY CASE WHEN Status='Adjusted' THEN 0 ELSE 1 END) AS RN,
           *
    FROM @TimeSheet
), Y AS
    (
        SELECT CASE WHEN CN=1 AND RN=1 AND Status<>'Posted' THEN 'Error'
                    ELSE '' 
               END AS Error,
               *
        FROM X
    )

SELECT *
FROM Y
WHERE RN=1

答案 2 :(得分:0)

从您的代码中,我认为您正在尝试这样做:

remaining