我想编写一个查询来从表中检索结果。
当我的所有状态都完成时,显示我已完成。当状态已完成但还有其他状态(例如进行中或已创建)时,仅显示其他状态
自定义名称 | 状态 | 顺序 |
---|---|---|
伊万·伊万诺夫 | 完成 | 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]
答案 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)