请教查询 多行字段一行显示

luoluojin 2011-04-15 12:58:02
如下表:
ID1 ID2 jine2
---- ----- -----------
001 00101 20
001 00101 80
001 00101 75
002 00101 200
002 00101 100
003 00101 70
004 00101 70
004 00101 70
004 00101 70

怎么样得到如下:
001 00101 20 80 75
002 00101 200 100
003 00101 70
001 00101 70 70 70
...全文
215 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
yubofighting 2011-04-21
  • 打赏
  • 举报
回复

select identity(int,1,1) as code,* into #x from tb


declare @sql varchar(max)
set @sql='select code'
select @sql=@sql+' ,max(case id when '''+id+''' then name else '''' end) ['+id+']' from (select distinct id from #x)u
set @sql=@sql+'from #x group by code'
exec(@sql)

可以借鉴一下
yubofighting 2011-04-19
  • 打赏
  • 举报
回复

create table c(id1 varchar(50),id2 varchar(50),jine2 varchar(50))

insert into c values('001','00101','20')

insert into c values('001','00101','80')

insert into c values('001','00101','75')

insert into c values('002','00101','200')

insert into c values('002','00101','100')

insert into c values('003','00101','70')

insert into c values('004','00101','70')

insert into c values('004','00101','70')

insert into c values('004','00101','70')


create function getnum
(@id1 varchar(50))
returns varchar(50)
as
begin
declare @sql varchar(50)
set @sql=''
select @sql=@sql+jine2+',' from c where id1=@id1
set @sql=@sql
return @sql
end


select distinct id1,max(id2),dbo.getnum(id1) as jine2 from c group by id1,jine2
dawugui 2011-04-15
  • 打赏
  • 举报
回复
Create table tb(ID1 varchar(30),ID2 varchar(30), jine2 int)
Insert into tb(ID1,ID2,jine2)
Select '001','00101',20 union all
Select '001','00101',80 union all
Select '001','00101',75 union all
Select '002','00101',200 union all
Select '002','00101',100 union all
Select '003','00101',70 union all
Select '004','00101',70 union all
Select '004','00101',70 union all
Select '004','00101',70
go

declare @sql varchar(8000)
set @sql = 'select id1 , id2 '
select @sql = @sql + ' , max(case px when ''' + cast(px as varchar) + ''' then ltrim(jine2) else '''' end) [jine2_' + cast(px as varchar) + ']'
from (select distinct px from (select *,row_number() over(partition by id1 order by jine2) px from tb) m) as a
set @sql = @sql + ' from (select *,row_number() over(partition by id1 order by jine2) px from tb) m group by id1,id2'
exec(@sql)

drop table tb

/*
id1 id2 jine2_1 jine2_2 jine2_3
------------------------------ ------------------------------ ------------ ------------ ------------
001 00101 20 75 80
002 00101 100 200
003 00101 70
004 00101 70 70 70

(4 行受影响)
*/


上为sql 2005使用row_number完成,如果是sql 2000,因为你的数据存在全部重复,需要使用临时表完成.
Barton 2011-04-15
  • 打赏
  • 举报
回复


Create table #t1(ID1 varchar(30),ID2 varchar(30), jine2 int)
Insert into #t1(ID1,ID2,jine2)
Select '001','00101',20 union all
Select '001','00101',80 union all
Select '001','00101',75 union all
Select '002','00101',200 union all
Select '002','00101',100 union all
Select '003','00101',70 union all
Select '004','00101',70 union all
Select '004','00101',70 union all
Select '004','00101',70

SELECT ROW_NUMBER()OVER(PARTITION BY id1 ORDER BY jine2) AS ID,*
INTO #T2
FROM #t1

DECLARE @cols VARCHAR(1000)='',@sql VARCHAR(1000)
;With TT
as
(
SELECT DISTINCT ID FROM #t2
)
SELECT @cols=@cols+',['+cast(ID AS VARCHAR(5)) +']'
FROM TT
ORDER BY id
SELECT @cols=right(@cols,LEN(@cols)-1)
SET @sql=
'Select *
From #t2 pivot(max(jine2) for ID in ('+@cols+' )) as a'
PRINT @sql
EXEC sp_sqlexec @sql
--------------------------------
ID1 ID2 1 2 3
001 00101 20 75 80
002 00101 100 200 NULL
003 00101 70 NULL NULL
004 00101 70 70 70
--小F-- 2011-04-15
  • 打赏
  • 举报
回复
*
标题:普通行列转换(version 2.0)
作者:爱新觉罗.毓华(十八年风雨,守得冰山雪莲花开)
时间:2008-03-09
地点:广东深圳
说明:普通行列转换(version 1.0)仅针对sql server 2000提供静态和动态写法,version 2.0增加sql server 2005的有关写法。

问题:假设有张学生成绩表(tb)如下:
姓名 课程 分数
张三 语文 74
张三 数学 83
张三 物理 93
李四 语文 74
李四 数学 84
李四 物理 94
想变成(得到如下结果):
姓名 语文 数学 物理
---- ---- ---- ----
李四 74 84 94
张三 74 83 93
-------------------
*/

create table tb(姓名 varchar(10) , 课程 varchar(10) , 分数 int)
insert into tb values('张三' , '语文' , 74)
insert into tb values('张三' , '数学' , 83)
insert into tb values('张三' , '物理' , 93)
insert into tb values('李四' , '语文' , 74)
insert into tb values('李四' , '数学' , 84)
insert into tb values('李四' , '物理' , 94)
go

--SQL SERVER 2000 静态SQL,指课程只有语文、数学、物理这三门课程。(以下同)
select 姓名 as 姓名 ,
max(case 课程 when '语文' then 分数 else 0 end) 语文,
max(case 课程 when '数学' then 分数 else 0 end) 数学,
max(case 课程 when '物理' then 分数 else 0 end) 物理
from tb
group by 姓名

--SQL SERVER 2000 动态SQL,指课程不止语文、数学、物理这三门课程。(以下同)
declare @sql varchar(8000)
set @sql = 'select 姓名 '
select @sql = @sql + ' , max(case 课程 when ''' + 课程 + ''' then 分数 else 0 end) [' + 课程 + ']'
from (select distinct 课程 from tb) as a
set @sql = @sql + ' from tb group by 姓名'
exec(@sql)

--SQL SERVER 2005 静态SQL。
select * from (select * from tb) a pivot (max(分数) for 课程 in (语文,数学,物理)) b

--SQL SERVER 2005 动态SQL。
declare @sql varchar(8000)
select @sql = isnull(@sql + '],[' , '') + 课程 from tb group by 课程
set @sql = '[' + @sql + ']'
exec ('select * from (select * from tb) a pivot (max(分数) for 课程 in (' + @sql + ')) b')

---------------------------------

/*
问题:在上述结果的基础上加平均分,总分,得到如下结果:
姓名 语文 数学 物理 平均分 总分
---- ---- ---- ---- ------ ----
李四 74 84 94 84.00 252
张三 74 83 93 83.33 250
*/

--SQL SERVER 2000 静态SQL。
select 姓名 姓名,
max(case 课程 when '语文' then 分数 else 0 end) 语文,
max(case 课程 when '数学' then 分数 else 0 end) 数学,
max(case 课程 when '物理' then 分数 else 0 end) 物理,
cast(avg(分数*1.0) as decimal(18,2)) 平均分,
sum(分数) 总分
from tb
group by 姓名

--SQL SERVER 2000 动态SQL。
declare @sql varchar(8000)
set @sql = 'select 姓名 '
select @sql = @sql + ' , max(case 课程 when ''' + 课程 + ''' then 分数 else 0 end) [' + 课程 + ']'
from (select distinct 课程 from tb) as a
set @sql = @sql + ' , cast(avg(分数*1.0) as decimal(18,2)) 平均分 , sum(分数) 总分 from tb group by 姓名'
exec(@sql)

--SQL SERVER 2005 静态SQL。
select m.* , n.平均分 , n.总分 from
(select * from (select * from tb) a pivot (max(分数) for 课程 in (语文,数学,物理)) b) m,
(select 姓名 , cast(avg(分数*1.0) as decimal(18,2)) 平均分 , sum(分数) 总分 from tb group by 姓名) n
where m.姓名 = n.姓名

--SQL SERVER 2005 动态SQL。
declare @sql varchar(8000)
select @sql = isnull(@sql + ',' , '') + 课程 from tb group by 课程
exec ('select m.* , n.平均分 , n.总分 from
(select * from (select * from tb) a pivot (max(分数) for 课程 in (' + @sql + ')) b) m ,
(select 姓名 , cast(avg(分数*1.0) as decimal(18,2)) 平均分 , sum(分数) 总分 from tb group by 姓名) n
where m.姓名 = n.姓名')

drop table tb

------------------
------------------
AcHerat 2011-04-15
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 luoluojin 的回复:]

引用 1 楼 josy 的回复:
SQL code
select
id1,
id2,
jine2=(select ' '+ltrim(jine2) from tb where id1=t.id1 and id2=t.id2 for xml path(''))
from
tb t
group by
id1,id2



这个还是没达到我要的效果
你那最后是拼成一列了 我……
[/Quote]

动态行转列,自己加个标识字段 2000 用identity 和 count 2005 用 row_number 然后按照动态的行转列去做,在字符里面 group by 新作的标识列,行转列的例子很多,搜搜就知道了。
luoluojin 2011-04-15
  • 打赏
  • 举报
回复
[Quote=引用 1 楼 josy 的回复:]
SQL code
select
id1,
id2,
jine2=(select ' '+ltrim(jine2) from tb where id1=t.id1 and id2=t.id2 for xml path(''))
from
tb t
group by
id1,id2
[/Quote]


这个还是没达到我要的效果
你那最后是拼成一列了 我要是有几个就显示几列
AcHerat 2011-04-15
  • 打赏
  • 举报
回复

有表tb, 如下:
id value
----- ------
1 aa
1 bb
2 aaa
2 bbb
2 ccc
需要得到结果:
id values
------ -----------
1 aa,bb
2 aaa,bbb,ccc
即, group by id, 求 value 的和(字符串相加)

1. 旧的解决方法

-- 1. 创建处理函数
CREATE FUNCTION dbo.f_str(@id int)
RETURNS varchar(8000)
AS
BEGIN
DECLARE @r varchar(8000)
SET @r = ''
SELECT @r = @r + ',' + value
FROM tb
WHERE id=@id
RETURN STUFF(@r, 1, 1, '')
END
GO
-- 调用函数

SELECt id, values=dbo.f_str(id)
FROM tb
GROUP BY id

-- 2. 新的解决方法
-- 示例数据
DECLARE @t TABLE(id int, value varchar(10))
INSERT @t SELECT 1, 'aa'
UNION ALL SELECT 1, 'bb'
UNION ALL SELECT 2, 'aaa'
UNION ALL SELECT 2, 'bbb'
UNION ALL SELECT 2, 'ccc'

-- 查询处理
SELECT *
FROM(
SELECT DISTINCT
id
FROM @t
)A
OUTER APPLY(
SELECT
[values]= STUFF(REPLACE(REPLACE(
(
SELECT value FROM @t N
WHERE id = A.id
FOR XML AUTO
), '<N value="', ','), '"/>', ''), 1, 1, '')
)N

/*--结果
id values
----------- ----------------
1 aa,bb
2 aaa,bbb,ccc
(2 行受影响)
--*/

--各种字符串分函数

--3.3.1 使用游标法进行字符串合并处理的示例。
--处理的数据
CREATE TABLE tb(col1 varchar(10),col2 int)
INSERT tb SELECT 'a',1
UNION ALL SELECT 'a',2
UNION ALL SELECT 'b',1
UNION ALL SELECT 'b',2
UNION ALL SELECT 'b',3

--合并处理
--定义结果集表变量
DECLARE @t TABLE(col1 varchar(10),col2 varchar(100))

--定义游标并进行合并处理
DECLARE tb CURSOR LOCAL
FOR
SELECT col1,col2 FROM tb ORDER BY col1,col2
DECLARE @col1_old varchar(10),@col1 varchar(10),@col2 int,@s varchar(100)
OPEN tb
FETCH tb INTO @col1,@col2
SELECT @col1_old=@col1,@s=''
WHILE @@FETCH_STATUS=0
BEGIN
IF @col1=@col1_old
SELECT @s=@s+','+CAST(@col2 as varchar)
ELSE
BEGIN
INSERT @t VALUES(@col1_old,STUFF(@s,1,1,''))
SELECT @s=','+CAST(@col2 as varchar),@col1_old=@col1
END
FETCH tb INTO @col1,@col2
END
INSERT @t VALUES(@col1_old,STUFF(@s,1,1,''))
CLOSE tb
DEALLOCATE tb
--显示结果并删除测试数据
SELECT * FROM @t
DROP TABLE tb
/*--结果
col1 col2
---------- -----------
a 1,2
b 1,2,3
--*/
GO


/*==============================================*/


--3.3.2 使用用户定义函数,配合SELECT处理完成字符串合并处理的示例
--处理的数据
CREATE TABLE tb(col1 varchar(10),col2 int)
INSERT tb SELECT 'a',1
UNION ALL SELECT 'a',2
UNION ALL SELECT 'b',1
UNION ALL SELECT 'b',2
UNION ALL SELECT 'b',3
GO

--合并处理函数
CREATE FUNCTION dbo.f_str(@col1 varchar(10))
RETURNS varchar(100)
AS
BEGIN
DECLARE @re varchar(100)
SET @re=''
SELECT @re=@re+','+CAST(col2 as varchar)
FROM tb
WHERE col1=@col1
RETURN(STUFF(@re,1,1,''))
END
GO

--调用函数
SELECT col1,col2=dbo.f_str(col1) FROM tb GROUP BY col1
--删除测试
DROP TABLE tb
DROP FUNCTION f_str
/*--结果
col1 col2
---------- -----------
a 1,2
b 1,2,3
--*/
GO

/*==============================================*/


--3.3.3 使用临时表实现字符串合并处理的示例
--处理的数据
CREATE TABLE tb(col1 varchar(10),col2 int)
INSERT tb SELECT 'a',1
UNION ALL SELECT 'a',2
UNION ALL SELECT 'b',1
UNION ALL SELECT 'b',2
UNION ALL SELECT 'b',3

--合并处理
SELECT col1,col2=CAST(col2 as varchar(100))
INTO #t FROM tb
ORDER BY col1,col2
DECLARE @col1 varchar(10),@col2 varchar(100)
UPDATE #t SET
@col2=CASE WHEN @col1=col1 THEN @col2+','+col2 ELSE col2 END,
@col1=col1,
col2=@col2
SELECT * FROM #t
/*--更新处理后的临时表
col1 col2
---------- -------------
a 1
a 1,2
b 1
b 1,2
b 1,2,3
--*/
--得到最终结果
SELECT col1,col2=MAX(col2) FROM #t GROUP BY col1
/*--结果
col1 col2
---------- -----------
a 1,2
b 1,2,3
--*/
--删除测试
DROP TABLE tb,#t
GO


/*==============================================*/

--3.3.4.1 每组 <=2 条记录的合并
--处理的数据
CREATE TABLE tb(col1 varchar(10),col2 int)
INSERT tb SELECT 'a',1
UNION ALL SELECT 'a',2
UNION ALL SELECT 'b',1
UNION ALL SELECT 'b',2
UNION ALL SELECT 'c',3

--合并处理
SELECT col1,
col2=CAST(MIN(col2) as varchar)
+CASE
WHEN COUNT(*)=1 THEN ''
ELSE ','+CAST(MAX(col2) as varchar)
END
FROM tb
GROUP BY col1
DROP TABLE tb
/*--结果
col1 col2
---------- ----------
a 1,2
b 1,2
c 3
--*/

--3.3.4.2 每组 <=3 条记录的合并
--处理的数据
CREATE TABLE tb(col1 varchar(10),col2 int)
INSERT tb SELECT 'a',1
UNION ALL SELECT 'a',2
UNION ALL SELECT 'b',1
UNION ALL SELECT 'b',2
UNION ALL SELECT 'b',3
UNION ALL SELECT 'c',3

--合并处理
SELECT col1,
col2=CAST(MIN(col2) as varchar)
+CASE
WHEN COUNT(*)=3 THEN ','
+CAST((SELECT col2 FROM tb WHERE col1=a.col1 AND col2 NOT IN(MAX(a.col2),MIN(a.col2))) as varchar)
ELSE ''
END
+CASE
WHEN COUNT(*)>=2 THEN ','+CAST(MAX(col2) as varchar)
ELSE ''
END
FROM tb a
GROUP BY col1
DROP TABLE tb
/*--结果
col1 col2
---------- ------------
a 1,2
b 1,2,3
c 3
--*/
GO
if not object_id('A') is null
drop table A
Go
Create table A([id] int,[cname] nvarchar(2))
Insert A
select 1,N'张三' union all
select 2,N'李四' union all
select 3,N'王五' union all
select 4,N'蔡六'
Go
--> -->

if not object_id('B') is null
drop table B
Go
Create table B([id] int,[cname] nvarchar(5))
Insert B
select 1,N'1,2,3' union all
select 2,N'3,4'
Go
create function F_str(@cname nvarchar(100))
returns nvarchar(100)
as
begin
select @cname=replace(@cname,ID,[cname]) from A where patindex('%,'+rtrim(ID)+',%',','+@cname+',')>0
return @cname
end
go
select [id],dbo.F_str([cname])[cname] from B

id cname
----------- ----------------------------------------------------------------------------------------------------
1 张三,李四,王五
2 王五,蔡六

(2 個資料列受到影響)
百年树人 2011-04-15
  • 打赏
  • 举报
回复
select 
id1,
id2,
jine2=(select ' '+ltrim(jine2) from tb where id1=t.id1 and id2=t.id2 for xml path(''))
from
tb t
group by
id1,id2

27,581

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server 应用实例
社区管理员
  • 应用实例社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧