簡體   English   中英

帶有動態列的數據透視TSQL表

[英]Pivot TSQL table with dynamic columns

我將JSON作為參數傳遞給SQL存儲過程。 我使用一個使用JSON字典並創建具有鍵值對(兩列)的表的函數,然后將其與COALESCE一起用於為INSERT語句創建動態sql。 這對於單個字典來說效果很好,但是我還需要能夠發送包含字典數組的JSON字符串。 現在,我的解析函數給了我這個表變量:

在此處輸入圖片說明

我需要的是一個這樣的表變量:

在此處輸入圖片說明

我可以從第一個表中獲取列名稱:

SELECT DISTINCT element name from @JSONTable

我應該提到,這些elementname可以並且將會改變。 我將不知道不同的elementname值的數量。

更新-使用Umair的答案,我越來越接近:

DECLARE @JSONString AS VARCHAR(MAX)

SET @JSONString = '[{"ravid":3,"ravversion":2,"taskid":3},{"ravid":4,"ravversion":7,"taskid":99}]'

IF OBJECT_ID('tempdb..#JSONTable') IS NOT NULL
    DROP TABLE #JSONTable


CREATE TABLE #JSONTable
            (
              elementname VARCHAR(500) ,
              elementvalue VARCHAR(500)
            )
        INSERT  INTO #JSONTable
                ( elementname ,
                  elementvalue

                )
                SELECT  NAME ,
                        StringValue
                FROM    dbo.parseJSON(@JSONString)
                WHERE   LEN(StringValue) > 0 AND NAME IS NOT NULL



--declare a csv variable with all the distinct elements
DECLARE @csv NVARCHAR(max) = STUFF(
    (
         SELECT ',' + elementname
         FROM (
              SELECT DISTINCT elementname
              FROM #JSONTable
         ) AS e
         FOR XML PATH(''), TYPE
    ).value('.', 'nvarchar(max)'),
    1,
    1,
    ''
);

DECLARE @sql NVARCHAR(MAX) = '
    SELECT *
    FROM (
       SELECT *, Row = ROW_NUMBER() OVER (PARTITION BY elementname ORDER BY elementname)
       FROM #JSONTable
    ) AS t
    PIVOT (
        MAX(elementvalue)
        FOR elementname IN (' + @csv + ')
    ) AS p
'

EXEC sp_executesql @sql

但是字典值與鍵不對應。 這是Umair當前答案的結果: 在此處輸入圖片說明

怎么樣

--declare a csv variable with all the distinct elements
DECLARE @csv NVARCHAR(max) = STUFF(
    (
         SELECT ',' + elementname
         FROM (
              SELECT DISTINCT elementname
              FROM #JSONTable
         ) AS e
         FOR XML PATH(''), TYPE
    ).value('.', 'nvarchar(max)'),
    1,
    1,
    ''
);

DECLARE @sql NVARCHAR(MAX) = '
    SELECT *
    FROM (
       SELECT *, Row = ROW_NUMBER() OVER (PARTITION BY elementname ORDER BY elementvalue)
       FROM #JSONTable
    ) AS t
    PIVOT (
        MAX(elementvalue)
        FOR elementname IN (' + @csv + ')
    ) AS p
'

EXEC sp_executesql @sql

即動態樞軸:)

編輯:

由於您不希望通過數據透視表中的任何內容進行聚合,因此我添加了一個行號功能,為每個不同的elementname分配一個按順序遞增的id(基於element值)。 這實際上將按此行列將數據透視表分組,從而生成所有必需的行。

暫無
暫無

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

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