检索不同的客户状态
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;
我想编写一个查询来检索 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;