我有一个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
这是具有两种状态的实际记录的示例
谢谢
答案 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 Id
(CN
)对行进行计数,然后首先分配一个row_number
(RN
),并按“ 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