在案例函数

时间:2015-06-19 08:20:22

标签: sql sql-server case

我是SQL的新手,我正在尝试在视图中应用case函数。 虽然我理解它的基本原理,但我很难以我需要的方式应用它。

我有3列ApplicationID,ServerName和ServerShared? (真/假)。

每个应用程序可以有许多与之关联的服务器,而每个服务器只有1个服务器类型。

我想使用case来创建另一个字段,该字段可以取三个值,这取决于与应用程序相关的ServerShared的值是否全部为True = Shared,False = Non-shared,Both True和False = Partially shared。

我的想法是在case函数中使用count函数来设置语句:

  • if'count true> 0并计算false> 0'然后ServerShared? = 部分如果'计数为真> 0'和'count false = 0'然后 ServerShared = true,反之亦然。

我认为上述逻辑是实现我的结果的一种方式,但是如果有更好的方法,我将非常感谢如何在案例陈述中构建这一点以及任何智慧。

提前致谢!

2 个答案:

答案 0 :(得分:0)

如果我的问题是正确的,那应该可以解决问题。也许您需要添加更多列或调整逻辑。但你应该掌握逻辑。

SELECT ServerName, 
    CASE 
    WHEN COUNT(distinct ServerShared) = 2 
        THEN N'Server shared'
    WHEN MIN(ServerShared) = 0
        THEN N'Server not shared'
    WHEN MAX(ServerShared) = 1
        THEN N'Server shared'
    END as ServerShared
FROM myTable 
GROUP BY ServerName

答案 1 :(得分:0)

有两种主要方法可以解决这个问题(非专家的超级通用答案:D)

  1. 执行次数较少(一次关闭?),执行速度慢,潜在的指数时间会随着行的增加而增加:
  2. 这与您建议的解决方案类似,并且涉及将其他查询放入查询的选择/字段列表部分 - 这将针对查询主要部分返回的每一行执行(一般来说是坏消息):

    select 
        applicationID
        , Case (select count * from table as b where a.applicationid = b.applicationid and shareserver=true)
            WHEN 0 then 'Non-Shared'
            WHEN (select count * from table where a.applicationid = b.applicationid) then 'Shared'
            ELSE 'Partially-Shared' END as ShareType
    from 
        tabls as a
    
    1. 获取所有数据,然后逐行执行比较。这是我默认使用的...据我所知,它基本上更好但有时可能更难以思考。
    2. 这一行是为了修复格式问题

      select 
          a.applicationid
          ,case
            when sharedservers = 0 then 'Non-Shared'
            when totalservers=sharedservers then 'Shared'
            else 'Partially-Shared' END as ShareType
      FROM
          (select applicationID, count(*) as TotalServers from table) as a
           LEFT OUTER JOIN (select applicationID, count(*) as SharedServersfrom table where sharedserver = true) as b
                ON a.applicationid=b.applicationid
      

      这些查询只是写在我的头顶,请告诉我是否有bug:/

      还要注意case语句的两种用法。一个CASE *value* WHEN *possible value* THEN ..,第二个CASE WHEN *statement that evaluates to boolean* THEN ..