简体   繁体   English

根据结果在SQL新建列名

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

So I have a SQL query that outputs say 15 columns of data.所以我有一个 SQL 查询,它输出 15 列数据。 I have 3 rows.我有 3 行。

All rows results are identical apart from 2 fields.除了 2 个字段外,所有行结果都相同。 I want to group all the results onto 1 line and create new columns and enter the value of the fields我想将所有结果分组到 1 行并创建新列并输入字段的值

Example例子

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

But I want the results to look like this但我希望结果看起来像这样

在此处输入图像描述

Thanks in advance you beautiful people提前谢谢你们美丽的人

SQL VERSION SQL 版本

Microsoft SQL Server 2012 (SP3) (KB3072779) - 11.0.6020.0 (X64)微软 SQL 服务器 2012 (SP3) (KB3072779) - 11.0.6020.0 (X64)

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

You can use a SELECT Statement containing XML PATH Clause in order to get dynamic pivot. Let's create a temporary table( #tab ) first in order to number the columns( Name and Value ) with changing values through use of ROW_NUMBER() function(Indeed,you can directly use Value column instead of generating sequential numbers, but I intentionally leave that function to get a generic solution ).您可以使用包含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

and then use it within the following code to get the desired result set然后在以下代码中使用它来获得所需的结果集

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;

Demo 演示

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM