[英]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例子
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()
函数对具有更改值的列( Name
和Value
)进行编号(确实如此,您可以直接使用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;
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.