检索不同的客户状态

时间:2021-07-27 08:18:15

标签: sql sql-server tsql sql-server-2008

我想编写一个查询来从表中检索结果。

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

<头>
自定义名称 状态 顺序
伊万·伊万诺夫 完成 1
Stoqn Stoqnov 完成 1
迪米特·伊万诺夫 完成 1
伊万·伊万诺夫 完成 2
迪米特·伊万诺夫 完成 2
伊万·伊万诺夫 处理中 2
Stoqn Stoqnov 完成 2
迪米特·伊万诺夫 完成 3
迪米特·伊万诺夫 创建 4
Stoqn Stoqnov 完成 3
伊万·伊万诺夫 完成 4
Stoqn Stoqnov 完成 4

预期结果

<头>
伊万·伊万诺夫 处理中
迪米特·伊万诺夫 创建
Stoqn Stoqnov 完成

查询:

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]

3 个答案:

答案 0 :(得分:2)

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

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;

返回:

<头>
自定义名称 状态
迪米特·伊万诺夫 创建
伊万·伊万诺夫 处理中
Stoqn Stoqnov 已完成

注意:提供我所展示的 DDL+DML,可以让人们更轻松地提供帮助。

答案 1 :(得分:2)

我认为这不需要窗口函数或交叉连接,只是一个带有条件计数的简单 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;

答案 2 :(得分:0)

尝试以下操作:

这个想法是使用 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)