检索不同的客户状态

Retrieve different customer status

我想编写一个查询来检索 table 的结果。

当我的所有状态都完成时显示我已完成。当状态已完成但存在其他状态(例如进行中或已创建)时,则仅显示其他状态

自定义名称 状态 订单
伊万·伊万诺夫 完成 1
斯托克·斯托克诺夫 完成 1
迪米蒂尔·伊万诺夫 完成 1
伊万·伊万诺夫 完成 2
迪米蒂尔·伊万诺夫 完成 2
伊万·伊万诺夫 进行中 2
斯托克·斯托克诺夫 完成 2
迪米蒂尔·伊万诺夫 完成 3
迪米蒂尔·伊万诺夫 已创建 4
斯托克·斯托克诺夫 完成 3
伊万·伊万诺夫 完成 4
斯托克·斯托克诺夫 完成 4

预期结果

伊万·伊万诺夫 进行中
迪米蒂尔·伊万诺夫 已创建
斯托克·斯托克诺夫 完成

查询:

SELECT distinct  CustomName,
(CASE WHEN  [STATUS] ='COMPLETED'    THEN 'completed' 
WHEN  [STATUS] ='inprocess' THEN 'inprocess' 
WHEN  [STATUS] ='created' THEN 'created'  END  ) AS [STATUS]
from [dbo].[Customers]

您可以执行如下操作,计算每个客户的每种状态的数量,然后按优先顺序选择要显示的内容。

declare @Test table (CustomName varchar(32), [STATUS] varchar(32), [Order] int)

insert into @Test (CustomName, [STATUS], [Order])
values
('Ivan Ivanov',     'completed',   1),
('Stoqn Stoqnov',   'completed',   1),
('Dimityr Ivanov',  'completed',   1),
('Ivan Ivanov',     'completed',   2),
('Dimityr Ivanov',  'completed',   2),
('Ivan Ivanov',     'inprocess',   2),
('Stoqn Stoqnov',   'completed',   2),
('Dimityr Ivanov',  'completed',   3),
('Dimityr Ivanov',  'created',     4),
('Stoqn Stoqnov',   'completed',   3),
('Ivan Ivanov',     'completed',   4),
('Stoqn Stoqnov',   'completed',   4);

with cte as (
    select CustomName
      , sum(case when [status] = 'completed' then 1 else 0 end) over (partition by CustomName) Completed
      , sum(case when [status] = 'created' then 1 else 0 end) over (partition by CustomName) Created
      , sum(case when [status] = 'inprocess' then 1 else 0 end) over (partition by CustomName) InProcess
    from @Test
)
select CustomName
    -- This logic could be more complex if desired
    , case when InProcess > 0 then 'In Process' when Created > 0 then 'Created' else 'Completed' end
from cte
group by CustomName, Completed, Created, InProcess;

Returns:

CustomName Status
Dimityr Ivanov Created
Ivan Ivanov In Process
Stoqn Stoqnov Completed

注意:提供我所展示的 DDL+DML,使人们更容易提供帮助。

尝试以下操作:

想法是使用 cte 查找所有包含不同类型状态的客户名称

然后使用 UNION ALL 查找 包含“已完成”状态的所有客户名称

;WITH cte AS (
    SELECT DISTINCT CustomName, [STATUS]
    FROM [dbo].[Customers]
    WHERE [STATUS] <> 'Completed'
)
SELECT *
FROM cte 
UNION ALL
SELECT DISTINCT CustomName, [STATUS]
FROM [dbo].[Customers]
WHERE CustomName NOT IN (SELECT CustomName FROM cte)

我认为这不需要 window 函数或交叉连接,只是一个简单的 GROUP BY 和条件计数

SELECT
  CustomName,
  CASE WHEN COUNT(CASE WHEN [status] = 'created'   THEN 1 END) > 0 THEN 'Created'
       WHEN COUNT(CASE WHEN [status] = 'inprocess' THEN 1 END) > 0 THEN 'In Process'
       ELSE 'Completed' END
FROM YourTable t
GROUP BY t.CustomName;