2013-04-24 68 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個查詢