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

Sup*_*NES 2 sql sql-server null case

我有一个大的,凌乱的报告写入连接5个表.一个表中有一列用于几个不同的值 - 实际上是一个"标记"列,其中标记以创造性的方式使用,具体取决于用户想要使用的各种元数据.

因此,我对报告的查询返回3个几乎完全相同的行,这些行仅在"tag"列中有所不同; 例如,我可能会得到:

NAME TAG EMAIL  
BOB  A   BOB@EXAMPLE.COM  
BOB  B   BOB@EXAMPLE.COM  
BOB  C   BOB@EXAMPLE.COM  
Run Code Online (Sandbox Code Playgroud)

我想要做的是将TAG列的内容拆分为3个单独的查询列,如下所示:

NAME A B C EMAIL
BOB  A B C BOB@EXAMPLE.COM
Run Code Online (Sandbox Code Playgroud)

所以我尝试使用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
Run Code Online (Sandbox Code Playgroud)

这显然不太理想.

Stack Overflow的任何想法,天才?

Den*_*eev 6

你需要pivot数据.

;with Report (name, tag, email) as
(
select 'BOB', 'A', 'BOB@BOB.COM' union
select 'BOB', 'B', 'BOB@BOB.COM' union
select 'BOB', 'C', 'BOB@BOB.COM' 
)
select * from Report
pivot 
( min(tag) for  tag in ([A], [B], [C]))  
as pvt
Run Code Online (Sandbox Code Playgroud)

运行上述查询的结果如下:

NAME    EMAIL         A  B  C
-----------------------------
BOB     BOB@BOB.COM   A  B  C
Run Code Online (Sandbox Code Playgroud)


Cha*_*ana 5

试试这个:

   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
Run Code Online (Sandbox Code Playgroud)

编辑:解释......
每当你使用Group By,你是在告诉你想让它来汇总结果为"桶",其中每个桶是由独特的价值观在集团中定义的列[或表达式]定义的查询处理器按条款.这意味着最终结果集将为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)
Run Code Online (Sandbox Code Playgroud)

然后,我将在输出(一个字母表中的每个字母),并在我的输出所有其他列获得最多26行必须以某种聚合函数在原来设置被应用到所有行的姓氏开始的地方用'A'表示姓氏以qa'B'开头的所有行等.

在您的问题中,Group By仅用于将输出集限制为每个不同用户和电子邮件一行.一旦做到这一点,就会出现在Select语句每个其他列只有一行需要有一个Min(),[ Max()将工作一样),只是为了满足中提到的syntacical要求粗斜体以上.在你的情况,集合中只会有一个非空行,因此只需要语法要求就可以使用Min()或Max();