我是SQL的新手,我正在尝试在视图中应用case函数。 虽然我理解它的基本原理,但我很难以我需要的方式应用它。
我有3列ApplicationID,ServerName和ServerShared? (真/假)。
每个应用程序可以有许多与之关联的服务器,而每个服务器只有1个服务器类型。
我想使用case来创建另一个字段,该字段可以取三个值,这取决于与应用程序相关的ServerShared的值是否全部为True = Shared,False = Non-shared,Both True和False = Partially shared。
我的想法是在case函数中使用count函数来设置语句:
我认为上述逻辑是实现我的结果的一种方式,但是如果有更好的方法,我将非常感谢如何在案例陈述中构建这一点以及任何智慧。
提前致谢!
答案 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)
这与您建议的解决方案类似,并且涉及将其他查询放入查询的选择/字段列表部分 - 这将针对查询主要部分返回的每一行执行(一般来说是坏消息):
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
这一行是为了修复格式问题
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 ..