在SQL Server SELECT语句中使用CASE时消除NULL
我要编写一个大而凌乱的报告,该报告跨5个表。一个表中有一列用于多个不同的值-
本质上是一个“标签”列,其中,根据用户要使用的其他各种元数据,以创造性的方式使用标签。
结果,我对报表的查询返回了3个几乎相同的行,仅在“标记”列中有所不同;例如,我可能会得到:
NAME TAG EMAIL
BOB A BOB@EXAMPLE.COM
BOB B BOB@EXAMPLE.COM
BOB C BOB@EXAMPLE.COM
我想做的就是将TAG列的内容拆分为三个独立的列,从查询中返回,如下所示:
NAME A B C EMAIL
BOB A B C BOB@EXAMPLE.COM
因此,我尝试使用SQL SERVER CASE / WHEN功能来执行此操作;我是说,例如,当Tag列的值为“ A”时,将其返回到列“ A”中;如果是“
B”,则将其放在“ B”中;等等。我以为这会返回上面的内容,但是它却给了我这个:
NAME A B C EMAIL
BOB A NULL NULL BOB@EXAMPLE.COM
BOB NULL B NULL BOB@EXAMPLE.COM
BOB NULL NULL C BOB@EXAMPLE.COM
这显然不理想。
有什么想法,堆栈溢出天才吗?
-
试试这个:
Select Name, Min (Case When tag = 'A' Then Tag End) A, Min (Case When tag = 'B' Then Tag End) B, Min (Case When tag = 'C' Then Tag End) C, email From tableName Group By Name, email
编辑:解释…每次
使用a时Group By
,您都在告诉查询处理器您希望它将结果聚合到“存储桶”中,其中每个存储桶由组中定义的列[或表达式]中的唯一值定义按子句。这意味着对于分组依据中定义的那些列[或表达式]中的每个唯一值集,最终结果集将只有一行,并且只有一行。查询中使用的所有其他列或表达式(“分组
依据”中 定义的列或表达式除外) 必须是基于聚合函数的表达式 (例如Count(),Sum(),Avg(),Min(),Max(
)等),它们会根据计算产生一个值,该值将应用于预汇总结果集中的所有行。例如,如果我要Group By
姓氏的第一个字符:Select Left(LastName, 1), Count(*), Sum(Salaray, Avg(Height), Min(DateOfBirth), etc. From Table Group By Left(LastName, 1)
那么我最多将在输出中获得26行(每个字母对应一个字母),而我的输出中的所有其他列必须基于某种聚合函数,才能应用于姓氏开头的原始集中的所有行以“
A”开头,则姓氏以“ a”开头的所有行均以“ B”开头,依此类推。在您的问题中,“分组依据”仅用于将输出集限制为每个不同的用户和电子邮件仅一行。完成此操作后,每行将只有一行。Select语句中的其他列需要有
Min()
[[Max()
也将同样起作用),仅是为了满足上面
粗体斜体中 提到的语法要求。 ,则集合中将只有一个非空行,因此仅出于语法要求而采用Min()或Max()是必要的…