簡體   English   中英

根據結果在SQL新建列名

[英]Create a new column name in SQL based on results

所以我有一個 SQL 查詢,它輸出 15 列數據。 我有 3 行。

除了 2 個字段外,所有行結果都相同。 我想將所有結果分組到 1 行並創建新列並輸入字段的值

例子

Account-Name-Value-UserCreatedBy-Date 1234 This 1 Me 01/01/2001 1234 Is 2 Me 01/01/2001 1234 Test 3 Me 01/01/2001

但我希望結果看起來像這樣

在此處輸入圖像描述

提前謝謝你們美麗的人

SQL 版本

微軟 SQL 服務器 2012 (SP3) (KB3072779) - 11.0.6020.0 (X64)

Standard Edition (64-bit) on Windows NT 6.3 <X64> (Build 9600: ) (Hypervisor)

您可以使用包含XML PATH子句的SELECT語句以獲得動態 pivot。讓我們首先創建一個臨時表( #tab ),以便通過使用ROW_NUMBER()函數對具有更改值的列( NameValue )進行編號(確實如此,您可以直接使用Value列而不是生成序列號,但我故意留下 function 以獲得通用解決方案)。

WITH t AS
(
 SELECT *, ROW_NUMBER() OVER (PARTITION BY [Account] ORDER BY [Value]) AS rn
   FROM [tab]
)
SELECT *, CONCAT('Value',rn) AS rn_v, CONCAT('Name',rn) AS rn_n 
 INTO #tab
 FROM t

然后在以下代碼中使用它來獲得所需的結果集

DECLARE @colsv1 AS NVARCHAR(MAX), @colsv2 AS NVARCHAR(MAX),   
        @colsn1 AS NVARCHAR(MAX), @colsn2 AS NVARCHAR(MAX),  
        @query  AS NVARCHAR(MAX)

SELECT @colsv1 = 
STUFF((SELECT DISTINCT ',' + QUOTENAME(CONCAT('Value',[rn])) 
         FROM #tab FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'),1,1,'');
     
SELECT @colsv2 = 
STUFF((SELECT DISTINCT ',' + 'MAX('+QUOTENAME(CONCAT('Value',[rn]))+') AS '
                           + QUOTENAME(CONCAT('Value',[rn]))
         FROM #tab FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'),1,1,'');
     
SELECT @colsn1 = 
STUFF(
      (SELECT DISTINCT ',' + QUOTENAME(CONCAT('Name',[rn])) 
         FROM #tab FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'),1,1,'');

SELECT @colsn2 = 
STUFF((SELECT DISTINCT ',' + 'MAX('+QUOTENAME(CONCAT('Name',[rn]))+') AS '
                           + QUOTENAME(CONCAT('Name',[rn]))
         FROM #tab FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'),1,1,'');
     
SET  @query = 
 N'SELECT [Account],'+ @colsv2 +','+ @colsn2 + ',[UserCreatedBy],[Date]'+
 N'  FROM #tab
    PIVOT 
    (
      MAX([Value]) FOR [rn_v] IN ('+ @colsv1 + N')
    ) AS p1
    PIVOT
    (
      MAX([Name])  FOR [rn_n] IN ('+ @colsn1 + N')
    ) AS p2 
    GROUP BY [Account],[UserCreatedBy],[Date] ';

EXEC sp_executesql @query;

演示

暫無
暫無

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

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