如何在透视中为列提供自定义名称

Posted

技术标签:

【中文标题】如何在透视中为列提供自定义名称【英文标题】:How to provide custom name to column in pivoting 【发布时间】:2016-05-12 10:32:41 【问题描述】:

我有一张这样的桌子:

id  unit
1   mm  
2   cm 
3   kg

当我对此执行枢轴操作时,我得到如下结果:

1  2  3
mm cm kg

是否可以在此处获取自定义列名,如下所示:

d1  d2  d3
mm  cm  kg

我为此使用 Pivot:

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

CREATE  table #t 
(id varchar(max),unit varchar(max))
insert into #t (id,unit)values 
(1,'kg'),
(2,'cm'),
(3,'mm'),
(4,'m')

DECLARE @statement NVARCHAR(max)
   ,@columns NVARCHAR(max)

SELECT @columns = ISNULL(@columns + ',', '') + N'[' + cast(tbl.id as varchar(max)) + ']'
   FROM (
   SELECT DISTINCT id
   FROM #t
   ) AS tbl

   SELECT @statement =  'select * 
                  INTO ##temp 
                  from (
                    SELECT id,[unit]
                    FROM #t
                    ) as s 
PIVOT
(max(unit) FOR id in(' + @columns + ')) as pvt
'


EXEC sp_executesql @statement = @statement




SELECT * FROM ##temp
DROP TABLE #t
DROP TABLE ##temp

有可能吗? 谢谢

【问题讨论】:

【参考方案1】:
IF OBJECT_ID('tempdb..#t') IS NOT NULL
    DROP TABLE #t
GO

CREATE TABLE #t (
    id VARCHAR(10),
    unit VARCHAR(100)
)
INSERT INTO #t (id, unit)
VALUES
    ('1', 'kg'),
    ('2', 'cm'),
    ('3', 'mm'),
    ('4', 'mm')

DECLARE @SQL NVARCHAR(MAX), @columns NVARCHAR(MAX)

SELECT @columns = STUFF((
    SELECT ',[D' + id + ']'
    FROM #t
    FOR XML PATH('')), 1, 1, '')

SELECT @SQL =  '
    SELECT * 
    FROM (
        SELECT [unit], col = N''D'' + id
        FROM #t
    ) s 
    PIVOT (MAX(unit) FOR col IN (' + @columns + ')) p'

EXEC sys.sp_executesql @SQL

【讨论】:

【参考方案2】:

只需为您的 ID 添加前缀即可。示例

SELECT @statement = 'select * INTO ##temp from 
                     ( SELECT [id] = ''d''+id,[unit] FROM #t ) as s 
                     PIVOT
                     (max(unit) FOR id in(' + @columns + ')) as pvt ' 

使用全局临时表也是一种糟糕的做法!尤其是一个名为##temp

【讨论】:

是的,这只是一个练习示例。这就是我使用全局临时表的原因。关于答案,它不起作用。仍然给出 1,2.. 作为列名【参考方案3】:

您可以在动态 sql 查询中使用 CASE 表达式。

CREATE TABLE #t
(
    id INT,
    unit VARCHAR(2)
);

INSERT INTO #t VALUES
(1,'mm'),
(2,'cm'),
(3,'kg');

DECLARE @query AS VARCHAR(MAX);

SELECT @query = 'SELECT ' + 
      STUFF
      (
         (
            SELECT DISTINCT ',MAX(CASE WHEN id =  '+ CAST(id AS VARCHAR(10))
              + ' THEN unit END) AS d' + CAST(id AS VARCHAR(10))
            FROM #t 
            FOR XML PATH('')
          ),
      1,1,'');
SELECT @query += ' FROM #t;';

EXECUTE(@query);

结果

+----+----+----+
| d1 | d2 | d3 |
+----+----+----+
| mm | cm | kg |
+----+----+----+

【讨论】:

【参考方案4】:
SELECT @statement = 'select * INTO ##temp from ( SELECT ''d''+id AS [id],[unit] FROM #t ) as s PIVOT (max(unit) FOR id in(' + @columns + ')) as pvt ' 

【讨论】:

以上是关于如何在透视中为列提供自定义名称的主要内容,如果未能解决你的问题,请参考以下文章

如何在Java RS json响应中为简单列表类型设置自定义名称

PowerQuery处理透视表总计行不能自定义计算

在 Hibernate 中将自定义对象属性存储为列

如何在 Flask-Appbuilder 中为 OAuth2.0 使用自定义提供程序 [keycloak]?

如何在spring data jpa中为自定义采石场提供可变参数而不使用for循环

如何在Angular2,agm-marker中为自定义标记图标添加边框?