Sql server 带分区的Case语句

Sql server 带分区的Case语句,sql-server,case,row-number,database-partitioning,Sql Server,Case,Row Number,Database Partitioning,我必须根据以下条件更新每个ID的状态。 一个ID可以有多个状态,但我必须根据条件选择状态 我的示例模式如下所示: CREATE TABLE [dbo].[Table1]( [ID] [nvarchar](50) NULL, [ApprovalDate] [datetime] NULL, [CreateDate] [datetime] NULL, [status] [nvarchar](50) NULL ) ; Insert into Table1 valu

我必须根据以下条件更新每个ID的状态。 一个ID可以有多个状态,但我必须根据条件选择状态

我的示例模式如下所示:

CREATE TABLE [dbo].[Table1](
    [ID] [nvarchar](50) NULL,
    [ApprovalDate] [datetime] NULL,
    [CreateDate] [datetime] NULL,   
    [status] [nvarchar](50) NULL
) 
;
Insert into Table1 values (1,null,null,'Approved')
Insert into Table1 values (1,null,null,'Modified')
Insert into Table1 values (1,null,null,'Later')
Insert into Table1 values (2,null,null,'Approved')
Insert into Table1 values (2,null,null,'Modified')
Insert into Table1 values (2,null,null,'Approved')
Insert into Table1 values (3,null,null,'Modified')
Insert into Table1 values (3,null,null,'Later')
Insert into Table1 values (4,null,null,'Approved')
如果ID 1已经批准,稍后修改,我应该说“部分修改”,如果ID已经批准并修改,那么也应该说“部分修改”。但是我得到的案例陈述不是按照ID进行的。它正在根据状态更改总体数据。请告知。我已经包括了SQL fiddler,输出应该有ID 1-部分修改,2-部分修改,3-修改,4-批准。。具有与表中相同的行数

select ID,
   CASE
      WHEN status = 'Approved' AND status IN('Modified','Later') 
         THEN 'Partial Modified'
      WHEN status = 'Approved' 
         THEN 'Approved'
      WHEN status IN('Modified','Edited') THEN 'Modified'
      ELSE status
      END status 
 group by ID,Status

下面的可能是一个可行的解决方案

SELECT ID,
   CASE WHEN MAX( CASE WHEN [status] = 'Approved' THEN 'Approved' ELSE NULL END ) = 'Approved'
            AND MAX( CASE WHEN [status] IN('Modified','Later') THEN 'Partial Modified' ELSE NULL END ) = 'Partial Modified'
        THEN 'Partial Modified'
        ELSE MAX([status]) -- this can go wrong if there are multiple status which don't fall into above condition.
        END AS [Status]     
FROM Table1
GROUP BY ID
方法:2 若希望得到与表中相同行数的结果,请使用下面的查询

;WITH CTE AS (
    SELECT ID,
       CASE WHEN MAX( CASE WHEN [status] = 'Approved' THEN 'Approved' ELSE NULL END ) = 'Approved'
                AND MAX( CASE WHEN [status] IN('Modified','Later') THEN 'Partial Modified' ELSE NULL END ) = 'Partial Modified'
            THEN 'Partial Modified'
            WHEN MAX( CASE WHEN [status] = 'Modified' THEN 'Modified' ELSE NULL END ) = 'Modified'
                AND MAX( CASE WHEN [status] IN('Edited','Later') THEN 'Modified' ELSE NULL END ) = 'Modified'
            THEN 'Modified'
            ELSE NULL -- this can go wrong if there are multiple status which don't fall into above condition.
            END AS [Status]     
    FROM Table1
    GROUP BY ID
) 
SELECT 
    t.ID,
    ISNULL(c.[status],t.[status]) AS [status]
FROM CTE AS c
INNER JOIN Table1 AS t ON t.ID = c.ID
GROUP BY t.ID, t.[status],c.[status]
输出

ID      status
------- ----------------
1       Partial Modified
1       Partial Modified
1       Partial Modified
2       Partial Modified
2       Partial Modified
3       Modified
3       Modified
4       Approved

您可以使用如下查询。 请注意,这种方法允许您将所有用例预先映射为整数值的简单组合,而不是复杂的用例表达式,例如当status='Approved'和status IN('Modified','Later')

是否希望ID行以相同的最终状态重复

因此,在这种情况下,解决方案将是

select 
T1.*,
T.[status]

from
Table1 T1
Join
(
    select id,
    case sum(v) 
        when 1 then 'approved'
        when 2 then 'modified'
        when 3 then 'partially modified'
        when 4 then 'partially modified'
        when 5 then 'partially modified'
        when 6 then 'modified'
        when 7 then 'partially modified'
    end [status] from
    Table1 t1 join
     (values( 'approved',1),('Modified',2),('later',4)) as t(s,v)
     on t1.[status]=t.s
     group by id
)T
on T.id=T1.id

您好,我希望ID行以相同的最终状态重复。您好,这不会根据需要提供o/p。。你能用数据验证一下吗?我想我们需要使用partition你能发布预期的输出吗?我已经添加了查询的输出,请检查并让我知道它应该是什么?ID 3应该已经“修改”了状态我已经更改了查询和输出,现在检查它是否适合你。
select 
T1.*,
T.[status]

from
Table1 T1
Join
(
    select id,
    case sum(v) 
        when 1 then 'approved'
        when 2 then 'modified'
        when 3 then 'partially modified'
        when 4 then 'partially modified'
        when 5 then 'partially modified'
        when 6 then 'modified'
        when 7 then 'partially modified'
    end [status] from
    Table1 t1 join
     (values( 'approved',1),('Modified',2),('later',4)) as t(s,v)
     on t1.[status]=t.s
     group by id
)T
on T.id=T1.id