2016-07-28 162 views
-1

我在看下面的链接:STUFF函数可以返回NULL值吗?

Can I Comma Delimit Multiple Rows Into One Column?

解决方案中使用的查询正是我需要的,也是需要返回NULL值。

SELECT t.TicketID, 
    STUFF(ISNULL((SELECT ', ' + x.Person 
      FROM @Tickets x 
      WHERE x.TicketID = t.TicketID 
     GROUP BY x.Person 
     FOR XML PATH (''), TYPE).value('.','VARCHAR(max)'), ''), 1, 2, '') [No Preceeding Comma] 
FROM @Tickets t 
GROUP BY t.TicketID 

如果每个[TicketID]都有一个关联的[Person],这很好用。

但是,如果Person为NULL,对于TicketID,我需要返回TicketID并将Person显示为NULL或空白。我无法干净地移除ISNULL。

从这:

[TicketID], [Person] 
T0001  Alice 
T0001  Bob 
T0002  Catherine 
T0002  Doug 
T0003  Elaine 
T0004  NULL 

要这样:

[TicketID], [Person] 
T0001  Alice, Bob 
T0002  Catherine, Doug 
T0003  Elaine 
T0004  NULL 
+0

你需要写上您的查询的顶'PIVOT' ...希望你可以探索 – techspider

+0

这是个问题吗?或试图讨论?查找MSDN,并有条不紊地前进。另外,没有理由不能提取,转换并使用您的数据。简化流程,它可能有助于找到优化的方法。 –

回答

0

这是你想要的吗?

SELECT t.TicketID, 
     STUFF((SELECT ', ' + COALESCE(t2.Person, '<NULL>') 
       FROM @Tickets t2 
       WHERE t2.TicketID = t.TicketID 
       FOR XML PATH (''), TYPE 
      ).value('.', 'VARCHAR(max)' 
        ), 1, 2, '' 
      ) as Persons 
FROM @Tickets t 
GROUP BY t.TicketID; 

子查询中的GROUP BY是没有必要的,除非你有重复。

+0

我收到以下错误:“东西函数需要4个参数。” – bojackh

+0

@bojackh。 。 。哎呀,我把你原来的语法留在代码那部分的答案中。以上应该是正确的表述。 –

+0

谢谢,看起来我们需要拿出,'') – bojackh

0

我看不到您的问题...这应该工作开箱即用。也许我不明白的问题...

  • 取出NOT NULLPerson
  • 增加了一个符合TicketID =“T0004”和NULL的人
  • 从查询中删除ISNULL
  • 简化你的代码

试试这个:

DECLARE @Tickets TABLE (
    [TicketID] char(5) NOT NULL, 
    [Person] nvarchar(15) NULL 
); 

INSERT INTO @Tickets VALUES 
    ('T0001', 'Alice'), 
    ('T0001', 'Bob'), 
    ('T0002', 'Catherine'), 
    ('T0002', 'Doug'), 
    ('T0003', 'Elaine'), 
    ('T0004', NULL); 

SELECT t.TicketID, 
    STUFF(
      (
      SELECT ', ' + x.Person 
      FROM @Tickets x 
      WHERE x.TicketID = t.TicketID 
      FOR XML PATH ('') 
      ),1,2,'') AS [No Preceeding Comma] 
FROM @Tickets t 
GROUP BY t.TicketID; 

结果

TicketID No Preceeding Comma 
T0001  Alice, Bob 
T0002  Catherine, Doug 
T0003  Elaine 
T0004  NULL