簡體   English   中英

了解TSQL和COALESCE在PIVOT中具有動態列

[英]Understanding TSQL and COALESCE to have dynamic columns in a PIVOT

昨天我曾問過類似的問題,但對於這種邏輯為何有效,仍然沒有基本的了解。 我得到了正確的結果,對此我感到滿意,但是為什么它會像以前那樣運作呢?

假設我們正在使用以下簡單查詢:

    create table #TestTable (FakeColumn varchar(50))
    INSERT INTO #TestTable (FakeColumn) VALUES ('ABC'),('DEF'),('GHI'),('JKL')

    DECLARE @columns VARCHAR(8000)

  SELECT @columns = COALESCE(@columns + ',[' + cast(FakeColumn as varchar) + ']',
  '[' + cast(FakeColumn as varchar)+ ']')
  FROM #TestTable
  GROUP BY FakeColumn

      select @columns

      drop table #TestTable

以下查詢的輸出是: [ABC],[DEF],[GHI],[JKL]恰好正是我所需要的...但是可以說我們將查詢修改為:

 SELECT @columns = '[' + cast(FakeColumn as varchar)+ ']'
 FROM #TestTable
 GROUP BY FakeColumn

 select @columns
  1. 為什么現在我的輸出是: [JKL]

現在,如果我們將COALESCE修改為僅包含第一個參數[將@columns附加在最前面]

  SELECT @columns = @columns + ',[' + cast(FakeColumn as varchar) + ']'
        FROM #TestTable
  GROUP BY FakeColumn
  1. 為什么現在輸出: NULL

似乎我在該COALESCE語句中的第一個值返回NULL,因此它應該轉到我的第二條語句,但這僅返回[JKL] ...但是,將它們兩個結合在一起,我得到了我需要的字符串...我我不確定這是如何工作的,或者為什么會這樣。 任何人都可以幫助向菜鳥解釋嗎?

1.為什么現在我的輸出是:[JKL]?

這很容易。 您在查詢中有一個group by ,因此它返回多行。 僅一行提供了對該變量的分配。 哪一行是任意的。

1.為什么現在我的輸出為:NULL?

這很容易。 變量@columns初始化為NULL 將任何內容連接為NULL產生NULL

 SELECT @columns = @columns + ',[' + cast(FakeColumn as varchar) + ']'
       FROM #TestTable
 GROUP BY FakeColumn

您此處的值為空,因為您在選擇之前聲明了@column而不包含任何值,因此初始值為NULL。 所有添加到NULL varchar的內容都將導致NULL結果

COALESCE返回第一個非NULL值。

下面的COALESCE中的第一個參數將返回NULL,因為默認情況下,添加到NULL值的任何內容均為NULL(您的@columns變量為NULL)。 因此,首先返回第二部分,然后在@columns具有值的情況下將其添加到COALESCE中

 SELECT @columns = COALESCE(@columns + ',[' + cast(FakeColumn as varchar) + ']',
 '[' + cast(FakeColumn as varchar)+ ']')
 FROM #TestTable
 GROUP BY FakeColumn

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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