2011-11-17 82 views
3

假设,我有3列和9行的表,我使用SQL Server 2008的SQL查询来获取格式的结果从一个表

我想写一个SQL查询来获取数据的前三行从原表中的一行 行然后从第4行到第6行获取数据并放入第二行等等。

表名是 “表1”

Primary_Key | Name | Age 

++++++++++++++++++++++++++++ 


A |  Kyle | 45 

B |  Rob | 66 

C |  Dhruba | 77 

D |  Susan | 99 

E |  Steve | 100 

F |  Mili | 34 

G |  Grover | 54 

H  |  Alan | 76 

I |  Paul | 16 

我找的这个结果我运行查询后:(3行,1列)提前

ColumnA 


+++++++++++++++ 

A, Kyle, 45, B, Rob,66, C,Dhruba,77 

D,Susan,99, E,Steve , 100,F, Mili, 34 

G ,   Grover , 54,H ,  Alan ,  76,I ,  Paul ,  16 

谢谢! “

+1

”从原始表中获得前三行数据在一行中“。您是否打算将一列中的三个值汇总为一个值? – Kash

+1

表格定义,样本数据和预期输出将非常有用。您还需要包含一个定义行(如果行)的列。 –

+1

更不用说为了达到预期输出而遵循的规则:) – Nonym

回答

1
declare @T table 
(
    Primary_Key char(1), 
    Name varchar(10), 
    Age int 
) 

insert into @T values 
('A' ,  'Kyle' , 45), 
('B' ,  'Rob' , 66), 
('C' ,  'Dhruba' , 77), 
('D' ,  'Susan' , 99), 
('E' ,  'Steve' , 100), 
('F' ,  'Mili' , 34), 
('G' ,  'Grover' , 54), 
('H' ,  'Alan' , 76), 
('I' ,  'Paul' , 16) 

;with C as 
(
    select *, 
     (row_number() over(order by Primary_Key) - 1)/3 as rn 
    from @T 
) 
select stuff((select ', '+C2.Primary_Key+', '+C2.Name+', '+cast(C2.Age as varchar(10)) 
       from C as C2 
       where C1.rn = C2.rn 
       for xml path(''), type).value('.', 'varchar(max)'), 1, 2, '') as ColumnA 

from C as C1 
group by C1.rn 
order by C1.rn 
+0

好的尝试,但这似乎并不奏效。语法问题我猜。还想使用NTILE(3)而不是ROW_NUMBER – Kash

+0

@Kash它确实有效。在这里尝试。 http://data.stackexchange.com/stackoverflow/q/118181/ –

+0

@Kash示例数据的插入语句需要SQL Server 2008,查询需要SQL Server 2005或更高版本。如果你有9行,使用ntile(3)将是正确的。 –