4

我刚刚开始学习 T-SQL,并且可以使用一些帮助来理解特定代码块中发生的事情。我在上一个问题中收到的答案中修改了一些代码,这是有问题的代码:

DECLARE @column_list AS varchar(max) 
SELECT @column_list = COALESCE(@column_list, ',') + 
    'SUM(Case When Sku2=' + CONVERT(varchar, Sku2) + 
    ' Then Quantity Else 0 End) As [' + 
    CONVERT(varchar, Sku2) + ' - ' + 
    Convert(varchar,Description) +'],'
FROM OrderDetailDeliveryReview 
Inner Join InvMast on SKU2 = SKU and LocationTypeID=4
GROUP BY Sku2 , Description
ORDER BY Sku2 

Set @column_list = Left(@column_list,Len(@column_list)-1)

Select @column_list

----------------------------------------

1 row is returned:
,SUM(Case When Sku2=157 Then Quantity Else 0 End) As [157 -..., SUM(Case ...

T-SQL 代码完全符合我的要求,即根据查询结果生成单个结果,然后在另一个查询中使用该结果。

但是,我无法弄清楚该语句如何通过在SELECT @column_list =...语句中将多个值放入单个字符串中SELECT。如果没有分配 to @column_list,该SELECT语句将简单地返回多行。如何通过在SELECT语句中使用变量将结果“扁平化”为一个值?我应该如何阅读此 T-SQL 以正确理解发生了什么?

4

2 回答 2

3

在 SQL Server 中:

SELECT @var = @var + col
FROM TABLE

实际上连接值。这是一种怪癖模式(我目前无法找到对功能文档的引用——该功能已在 SQL Server 社区中使用多年)。如果 @var 在开始时为 NULL(即未初始化的值),那么您需要一个 COALESCE 或 ISNULL(并且您将经常使用分隔符):

SELECT @var = ISNULL(@var, '') + col + '|'
FROM TABLE

或者这个来制作一个逗号分隔的列表,然后只删除前导逗号:

SELECT @var = ISNULL(@var, '') + ',' + col
FROM TABLE

SET @var = STUFF(@var, 1, 1, '')

或(由KM提供,依靠 NULL + ',' 产生 NULL 以消除列表中第一项对 STUFF 的需要):

SELECT @var = ISNULL(@var + ',', '') + col
FROM TABLE 

或者这个来制作一个带有前导、分隔和尾随逗号的列表:

SELECT @var = ISNULL(@var, ',') + col + ','
FROM TABLE
于 2010-03-31T19:02:14.703 回答
1

您将需要查看 COALESCE 函数。可以在这里看到一篇描述正在发生的事情的好文章。

于 2010-03-31T18:47:22.567 回答