【问题标题】: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

有可能吗? 谢谢

【问题讨论】:

    标签: sql sql-server sql-server-2008 tsql pivot


    【解决方案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 ' 
        

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 2018-12-26
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 2019-06-05
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多