简体   繁体   中英

How to provide custom name to column in pivoting

I have a table like this:

id  unit
1   mm  
2   cm 
3   kg

When I perform pivot operation on this, I am getting result as follows:

1  2  3
mm cm kg

Is it possible to get custom column names here, something like this:

d1  d2  d3
mm  cm  kg

I am using Pivot for this as:

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

Is it possible? Thanks

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

Just add a prefix to your ID. Example

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

Also it's terrible practice to use global temp tables! Especially one named ##temp

You can use a CASE expression with a dynamic sql query.

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);

Result

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

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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