【问题标题】:Retrieve different customer status检索不同的客户状态
【发布时间】:2021-10-03 01:34:14
【问题描述】:

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

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

CustomName STATUS order
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

预期结果

Ivan Ivanov inprocess
Dimityr Ivanov created
Stoqn Stoqnov completed

查询:

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]

【问题讨论】:

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


    【解决方案1】:

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

    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;
    

    返回:

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

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

    【讨论】:

    • 我不明白为什么这需要窗口函数:无论如何你都在分组,所以只需使用标准条件聚合
    • @Charlieface - 是的,有时我把事情复杂化了:)
    【解决方案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;
    

    【讨论】:

    • 这个不正常但是非常感谢大家的快速响应
    【解决方案3】:

    尝试以下方法:

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-01-08
      • 2018-10-23
      • 1970-01-01
      • 1970-01-01
      • 2012-03-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多