[英]What is happening in this T-SQL code? (Concatenting the results of a SELECT statement)
我剛剛開始學習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
語句。 如果沒有賦值給@column_list
, SELECT
語句將只返回多行。 如何通過在SELECT
語句中使用變量將結果“平化”為一個值? 我該如何閱讀此T-SQL以正確理解發生了什么?
在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
您將需要查看COALESCE功能。 這里可以看到一篇描述正在發生的事情的好文章。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.