繁体   English   中英

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

[英]How to provide custom name to column in pivoting

我有这样一张桌子:

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

可能吗? 谢谢

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

只需在您的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

您可以将CASE表达式与动态SQL查询一起使用。

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 |
+----+----+----+
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 ' 

暂无
暂无

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

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