Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/26.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql 将挂起替换为NA_Sql_Sql Server - Fatal编程技术网

Sql 将挂起替换为NA

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`

我有一个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`
预计产量为,

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;