Sql 将挂起替换为NA
我有一个select查询,返回如下结果Sql 将挂起替换为NA,sql,sql-server,Sql,Sql Server,我有一个select查询,返回如下结果 ID Status 1 Approved 2 Rejected 3 Pending 4 Pending 目标是将拒绝后的条目替换为“NA”。我尝试使用Case语句,但只有第三行被更改为NA。有人能帮我吗 我使用的查询是 case when Lag(a.Status,1) over (order by a.ID)='Rejected' then 'NA' else a.Status end as Status`
ID Status
1 Approved
2 Rejected
3 Pending
4 Pending
目标是将拒绝后的条目替换为“NA”。我尝试使用Case语句,但只有第三行被更改为NA。有人能帮我吗
我使用的查询是
case when Lag(a.Status,1) over (order by a.ID)='Rejected'
then 'NA'
else a.Status
end as Status`
预计产量为,
Approved
Rejected
NA
NA
目标是用NA替换被拒绝状态后的所有待处理记录。被拒绝后的所有记录替换与“替换待处理记录”不同
无论如何,这将适用于第二种情况
SELECT REPLACE(MYCOLUMN, 'Pending', 'NA')
也请检查此方法:
declare @test table (ID int, Status nvarchar(50))
INSERT INTO @test VALUES
(1, 'Approved'),
(2, 'Pending'),
(3, 'Rejected'),
(4, 'Pending'),
(5, 'Pending'),
(6, 'Approved'),
(7, 'Pending'),
(8, 'Maybe Pending'),
(9, 'Pending'),
(10, 'Rejected'),
(11, 'Pending'),
(12, 'Pending')
SELECT id, case
when Lag(a.Status,1) over (order by a.ID) in ('Rejected', 'Pending')
and A.STATUS = 'Pending'
then 'NA'
else a.Status
end as Status FROM @test a
输出:
id Status
1 Approved
2 Pending
3 Rejected
4 NA
5 NA
6 Approved
7 Pending
8 Maybe Pending
9 Pending
10 Rejected
11 NA
12 NA
在检查被拒绝的
条件时,可以使用带窗口的MAX()
或SUM()
IF OBJECT_ID('tempdb..#Status') IS NOT NULL
DROP TABLE #Status
CREATE TABLE #Status (
ID INT IDENTITY,
GroupID INT,
Status VARCHAR(100))
INSERT INTO #Status (
GroupID,
Status)
VALUES
(1, 'Approved'),
(1, 'Rejected'),
(1, 'Pending'),
(1, 'Pending'),
(1, 'Pending'),
(2, 'Pending'),
(2, 'Approved'),
(2, 'Pending'),
(2, 'Rejected'),
(2, 'Pending'),
(2, 'Pending')
;WITH WindowedMax AS
(
SELECT
S.ID,
S.GroupID,
S.Status,
RejectedCue = MAX(CASE WHEN S.Status = 'Rejected' THEN 1 END) OVER (PARTITION BY S.GroupID ORDER BY S.ID ASC)
FROM
#Status AS S
)
UPDATE S SET
Status = 'NA'
FROM
WindowedMax AS W
INNER JOIN #Status AS S ON W.ID = S.ID
WHERE
W.RejectedCue = 1 AND W.Status <> 'Rejected'
SELECT * FROM #Status AS S ORDER BY S.ID
/* Results:
ID GroupID Status
1 1 Approved
2 1 Rejected
3 1 NA
4 1 NA
5 1 NA
6 2 Pending
7 2 Approved
8 2 Pending
9 2 Rejected
10 2 NA
11 2 NA
*/
这个问题的严格答案是:
select (case when id > max(case when status = 'Rejected' then id end) over (order by id) and
status = 'Pending'
then 'NA' else status
end) as new_status
from t;
这会将上一次“拒绝”之后的所有“挂起”值转换为“NA”。我不确定当表中可能有更多行时这是否合理,但它用您提供的示例数据回答了这个特定问题。显示您的SQL查询,此处没有足够的信息。case when Lag(a.Status,1)over(order by a.ID)='Rejected'然后'NA'否则a.状态结束为Status向我们展示您的案例
表达式查询尝试!请用完整的SQL查询您的问题。添加更多示例数据,包含多个被拒绝的行,并指定预期结果。如果您评论您的否决票,这将很有帮助:)这实际上回答了OP问题我应该检查拒绝并用NA替换挂起状态。这将是一种糟糕的方式。想象一个未来状态称为计费挂起
,您的查询会将其转换为计费NA
。它也根本无法回答问题。OP希望更改拒绝后的所有状态。OP帖子中的任何内容都不会让我们认为会出现dif不同的未来值。它显然是为静态目的而设计的。是的,有,他们说只有第三行被更改,所以他们显然希望所有的值都被更改。这可以在视图中使用吗?
select (case when id > max(case when status = 'Rejected' then id end) over (order by id) and
status = 'Pending'
then 'NA' else status
end) as new_status
from t;