簡體   English   中英

這個T-SQL代碼發生了什么? (連接SELECT語句的結果)

[英]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_listSELECT語句將只返回多行。 如何通過在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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM