2013-04-24 64 views
0

我有一个这样的查询结果:更改列名在动态SQL

Date  User1 User2 User3 .... 
---------------------------------- 
1/1/2000 55  78 98 ... 
1/1/2001 26  33 56 ... 
1/1/2002 88  67 12 ... 

不知道列的数字,因为它是一个支点查询的结果。

我想列更改名称的东西,看起来像这样:

Date User1 (blue) User2 (green) User3(brown) 

颜色是我从另一个表中检索信息。

我该如何做到这一点?

谢谢

编辑:这是查询。

DECLARE @cols AS NVARCHAR(MAX), 
    @query AS NVARCHAR(MAX) 

select @cols = STUFF((SELECT distinct ',' + QUOTENAME(C.Name) 
        from [History] 



      FOR XML PATH(''), TYPE 
      ).value('.', 'NVARCHAR(MAX)') 
     ,1,1,'') 
set @query = 'SELECT [Date],' + @cols +' 
      from 
      (
       select [Date], Name, Value 
       from [History] 


      ) x 
      pivot 
      (
       max(value) 
       for Name in (' + @cols + ') 
      ) p ' 

execute(@query) 
+0

然后显示您的查询给你这个结果。 – hims056 2013-04-24 07:03:36

+1

这些值是从哪里来的?蓝色,绿色,棕色来自哪里?你想为每个用户名手动编写它们吗?如果是这样,然后手动列出列名不动态,因为你会手动编写颜色的名字。 – 2013-04-24 07:09:24

+1

***列数是未知的,因为它是数据透视查询的结果。***请向我们显示查询。 – Luv 2013-04-24 07:10:25

回答

1

SQL Fiddle

架构设置

create table history (date datetime, name varchar(10), value int); 
insert history values 
('20130101', 'user1', 123), 
('20130101', 'user2', 124), 
('20130101', 'user3', 125), 
('20130102', 'user1', 223), 
('20130102', 'user3', 223), 
('20130103', 'user2', 323); 

create table colours (name varchar(10), colour_name varchar(10)); 
insert colours values 
('user1', 'blue'), 
('user2', 'green'), 
('user3', 'brown'); 

查询

DECLARE @scols nvarchar(max), 
     @cols AS NVARCHAR(MAX), 
     @query AS NVARCHAR(MAX); 

select @cols = STUFF((
    SELECT ',' + QUOTENAME(C.Name) 
    from (select distinct name from [History]) C 
    ORDER BY C.Name 
    FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'),1,1,''); 

select @scols = STUFF((
    SELECT ',' + QUOTENAME(Name) + ' AS ' + QUOTENAME(colour_Name) 
    from (select distinct c.name, x.colour_name 
     from [History] C 
     JOIN colours x on x.name = c.name) y 
    ORDER BY Name 
    FOR XML PATH(''), TYPE).value('.', 'NVARCHAR(MAX)'),1,1,''); 

set @query = ' 
    SELECT [Date],' + @scols +' 
    from (
     select [Date], Name, Value 
     from [History] 
     ) x 
    pivot 
     (
     max(value) 
     for Name in (' + @cols + ') 
     ) p '; 

-- print @query --<< uncomment this line to see the query that gets generated 
exec (@query); 

Results

|       DATE | BLUE | GREEN | BROWN | 
------------------------------------------------------------- 
| January, 01 2013 00:00:00+0000 | 123 | 124 | 125 | 
| January, 02 2013 00:00:00+0000 | 223 | (null) | 223 | 
| January, 03 2013 00:00:00+0000 | (null) | 323 | (null) | 
0
select Date, User1 as blue,User2 as green,User3 as brown from tableName 

使用这样的查询。

使用'as'关键字来更改列名称。

+1

这些是静态列名。 OP特别要求提供动态列名,而不仅仅是如何重命名它们 – mark1234 2015-10-29 15:36:06

0

要得到映射您可以使用旧列名的查找表来新列的名称,例如

CREATE TABLE colname(
    oldname varchar(20), 
    newname varchar(20) 
) 

insert into colname values ('user1','user1 (blue)'); 
insert into colname values ('user2','user2 (green)'); 

,那么你可以建立一个使用该映射的SQL语句

declare @sq varchar(2000) 
set @sq ='select date' 
select @sq = @sq + ',' + oldname + ' as [' + newname +']' from colname 
set @sq = @sq + 'from (existing query goes here) ' 
select @sq 

时@sq中的sql看起来不错,你可以用

替代最后一个选择
exec (@sq) 

去ru n个查询