我刚开始学习T-SQL,可以帮助理解特定代码块中发生的事情。我修改了an answer I received in a previous question中的一些代码,这里是有问题的代码:
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
语句中将多个值放入单个字符串中的。如果没有赋值给@column_list
,SELECT
语句将只返回多行。如何通过在SELECT
语句中使变量将结果“平坦化”为一个值?我该如何阅读此T-SQL以正确理解正在发生的事情?
答案 0 :(得分: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
答案 1 :(得分:1)
您需要查看COALESCE功能。可以看到一篇描述正在发生的事情的好文章here。