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 コードは、クエリの結果に基づいて 1 つの結果を作成し、それを別のクエリで使用するという、まさに私が望んでいることを実行します。

SELECT @column_list =...ただし、ステートメント内にあることで、ステートメントが複数の値を単一の文字列に入れる方法を理解できませんSELECT。への代入がなければ@column_listSELECTステートメントは単純に複数の行を返します。SELECT結果が 1 つの値に "平坦化" されるというステートメント内に変数を含めることは、どのように行われるのでしょうか? 何が起こっているのかを正しく理解するには、この 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 +'に依存し、リストの最初の項目にSTUFFが不要になるようにNULLを生成します):

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 に答える