admin

在SQL Server SELECT语句中使用CASE时消除NULL

sql

我要编写一个大而凌乱的报告,该报告跨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

这显然不理想。

有什么想法,堆栈溢出天才吗?


阅读 171

收藏
2021-06-07

共1个答案

admin

试试这个:

   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()是必要的…

2021-06-07