2012-10-11 64 views
3

我有这个..行分列在SQL Server 2000

IDProspecto | IDObservacionCustomer | Observacion 
---------------------------------------------------------  
    2204078 | 275214    | 03/9 Hable con Claudia me informa que Roberto ya se termino le deje.. 
    2204078 | 294567    | 19/09 SOLICITAN LLAME MAÑANA A ALEJANDRO 
    2204078 | 295310    | 20/09 se envia mail a adrian 
    2204078 | 304102    | CIA SOLICITA NO INSTALE EQUIPO 

而且我希望有这样...

idprospecto | observacion1   | observacion2   | observacion3  | observacion4 | observacionN 
-----------------------------------------------------------------------------------------  
    2204078 | 03/09 Hable con clau... | 19/09 solicitan llame... | 20/09 se envia... | CIA solicita.. | ... 

我读了很多关于这一点,但我发现很难实现,因为我从来没有使用过光标,并且数据透视在SQL Server 2000中不可用,所以我希望这里有人能帮助我,谢谢。

+0

欢迎StackOverflow上:如果您发布的代码,XML或数据样本,** **请在高亮文本编辑器的线,然后点击“代码(编辑器)工具栏上的“样本”按钮(“{}”),以精确地格式化和语法突出显示它! –

回答

3

由于SQL Server 2000中不具备PIVOT功能,你应该能够使用类似下面的内容:

DECLARE @query AS NVARCHAR(4000) 
DECLARE @rowCount as int 
DECLARE @pivotCount as int 
DECLARE @pivotRow as varchar(10) 

set @rowCount = 1 
set @pivotRow = '' 

create table #colsPivot 
(
    id int IDENTITY(1,1), 
    name varchar(20), 
    CustId int 
) 

insert into #colsPivot 
select 'Observacion', IDObservacionCustomer 
from yourtable 

set @pivotCount= (select COUNT(*) from #colsPivot) 

-- reset rowcount 
set @rowCount = 1 
set @query = '' 

---- create the CASE string 
while @rowCount <= @pivotCount 
    begin 
     set @pivotRow = (select Top 1 CustId from #colsPivot) 

     set @query = @query + ', max(case when IDObservacionCustomer = ''' + @pivotRow + ''' then Observacion end) as ''Observacion_' + cast(@rowCount as varchar(10)) + '''' 

     delete from #colsPivot where CustId = @pivotRow 

     if @rowCount <= @pivotCount 
      begin 
       set @rowCount = @rowCount + 1 
      end 
    end 

-- add the rest of the SQL Statement 
set @query = 'SELECT IDProspecto ' + @query + ' from yourtable group by IDProspecto' 

exec(@query) 

SQL Fiddle With Demo

+0

令人惊叹!,非常感谢你的时间和你的伟大的解决方案! – user1738734

+0

@ user1738734如果答案对您有帮助,请确保通过左侧的复选标记选择一个。接受的解决方案有助于未来的访问者,甚至可以获得接受答案的声誉。 – Taryn

+0

我有问题实施此解决方案,首先,它不会丢弃#colspivot表,并不能放弃它手动我不知道为什么我管理员,如果我有很多行不工作,因为查询nvarchar限制,并最终有这个结果..“操作数数据类型文本对于最大操作符无效。“ – user1738734

1

你可以试试这个例子。

准备数据:

create table tab1 
(
    IDProspecto int, 
    IDObservacionCustomer int, 
    Observacion varchar(130) 
)  

insert into tab1 
values (2204078,275214 ,'03/9 Hable con Claudia me informa que Roberto ya se termino le deje..') 

insert into tab1 
values (2204078,294567 ,'19/09 SOLICITAN LLAME MAÑANA A ALEJANDRO ') 

insert into tab1 
values (2204078,295310 ,'20/09 se envia mail a adrian') 

insert into tab1 
values (2204078,304102 ,'CIA SOLICITA NO INSTALE EQUIPO') 

我们需要identity场,所以我创建新表,从TAB1复制数据。

create table tab2 
(
    id int identity, 
    IDProspecto int, 
    IDObservacionCustomer int, 
    Observacion varchar(130) 
) 

insert into tab2(IDProspecto,IDObservacionCustomer,Observacion) 
select IDProspecto,IDObservacionCustomer,Observacion from tab1 

运行查询:

declare @max int, @inc int, @SqlSel varchar(2000),@SqlJoin varchar(2000), @Sql varchar(2000) 

select @max = max(cnt) from (
select count(1) as cnt 
    from tab1 
) T 

select @inc = 1 
select @SqlSel = 'select distinct t.IDProspecto ' 
select @SqlJoin = 'from tab2 t' 
while @max>[email protected] 
begin 
    select @SqlSel= @SqlSel+', tab2'+convert(varchar,@inc)+'.Observacion as o'+convert(varchar,@inc) 
    select @SqlJoin = @SqlJoin+' left join tab2 as tab2'+convert(varchar,@inc)+' on t.IDProspecto = tab2'+convert(varchar,@inc)+'.IDProspecto and tab2'+convert(varchar,@inc)+'.id='+convert(varchar,@inc) 
    select @[email protected]+1 
end 

select @SqlSel, @SqlJoin 

exec(@SqlSel+' '+ @SqlJoin) 
+0

另一个伟大的解决方案!,非常感谢你的时间! – user1738734

+0

同样的问题,由varchar限制,我不得不查询大量的IDProspecto,如果我有多个IDProspecto,它会为每个IDProspecto上的每条评论创建大量的列。 – user1738734

+0

http://sqlfiddle.com/#!3/b8df5/1 – user1738734