【问题标题】:Create a new column name in SQL based on results根据结果​​在 SQL 中创建新的列名
【发布时间】:2021-04-19 19:25:52
【问题描述】:

所以我有一个输出 15 列数据的 SQL 查询。我有 3 行。

除了 2 个字段之外,所有行的结果都是相同的。我想将所有结果分组到 1 行并创建新列并输入字段的值

例子

但我希望结果看起来像这样

在此先感谢你们这些可爱的人

SQL 版本

Microsoft SQL Server 2012 (SP3) (KB3072779) - 11.0.6020.0 (X64)

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

【问题讨论】:

  • 你的 DBMS 是什么?了解 DBMS,我们可能能够动态地旋转数据。
  • Microsoft SQL Server 2012 (SP3) (KB3072779) - 11.0.6020.0 (X64) Standard Edition (64-bit) o​​n Windows NT 6.3 (Build 9600: ) (Hypervisor) 这有帮助吗?
  • 只要SQL Server 2012就够了:)

标签: sql sql-server group-by sql-server-2012 pivot


【解决方案1】:

您可以使用包含XML PATH 子句的SELECT 语句来获得动态枢轴。让我们首先创建一个临时表(#tab),以便通过使用ROW_NUMBER()函数对具有更改值的列(NameValue)进行编号(实际上,您可以直接使用Value列而不是生成序号,但我故意离开该函数以获得通用解决方案)。

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;

Demo

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-04-21
    • 2021-11-08
    • 1970-01-01
    相关资源
    最近更新 更多