如何让数据在一排显示出来?

zyf32145 2008-11-11 09:52:46
SQL语句!
select a.ord_nbr + '(' + a.ord_seq +')' aa
from trd_ord a
where a.ord_nbr
in
(select ord_nbr from trd_ord where ord_nbr = 'ORD0807003');

结果
AA
ORD0807003(0001)
ORD0807003(0002)

有没有办法让数据一排显示,我想要以下的结果,哪位大侠教教我?谢谢了
AA
ORD0807003(0001) / ORD0807003(0002)
...全文
167 21 打赏 收藏 转发到动态 举报
写回复
用AI写文章
21 条回复
切换为时间正序
请发表友善的回复…
发表回复
liubocy 2008-11-14
  • 打赏
  • 举报
回复
cun chu guo cheng!
zyf32145 2008-11-14
  • 打赏
  • 举报
回复
看来这个问题是比较麻烦!!
莫非真的没办法实现!
zyf32145 2008-11-14
  • 打赏
  • 举报
回复
看来我找到答案了,无解!

合并列值
原著:邹建
改编:爱新觉罗.毓华(十八年风雨,守得冰山雪莲花开) 2007-12-16 广东深圳

表结构,数据如下:
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. 旧的解决方法(在sql server 2000中只能用函数解决。)
--1. 创建处理函数
create table tb(id int, value varchar(10))
insert into tb values(1, 'aa')
insert into tb values(1, 'bb')
insert into tb values(2, 'aaa')
insert into tb values(2, 'bbb')
insert into tb values(2, 'ccc')
go

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, value = dbo.f_str(id) FROM tb GROUP BY id

drop table tb
drop function dbo.f_str

/*
id value
----------- -----------
1 aa,bb
2 aaa,bbb,ccc
(所影响的行数为 2 行)
*/

--2、另外一种函数.
create table tb(id int, value varchar(10))
insert into tb values(1, 'aa')
insert into tb values(1, 'bb')
insert into tb values(2, 'aaa')
insert into tb values(2, 'bbb')
insert into tb values(2, 'ccc')
go

--创建一个合并的函数
create function f_hb(@id int)
returns varchar(8000)
as
begin
declare @str varchar(8000)
set @str = ''
select @str = @str + ',' + cast(value as varchar) from tb where id = @id
set @str = right(@str , len(@str) - 1)
return(@str)
End
go

--调用自定义函数得到结果:
select distinct id ,dbo.f_hb(id) as value from tb

drop table tb
drop function dbo.f_hb

/*
id value
----------- -----------
1 aa,bb
2 aaa,bbb,ccc
(所影响的行数为 2 行)
*/

2. 新的解决方法(在sql server 2005中用OUTER APPLY等解决。)
create table tb(id int, value varchar(10))
insert into tb values(1, 'aa')
insert into tb values(1, 'bb')
insert into tb values(2, 'aaa')
insert into tb values(2, 'bbb')
insert into tb values(2, 'ccc')
go
-- 查询处理
SELECT * FROM(SELECT DISTINCT id FROM tb)A OUTER APPLY(
SELECT [values]= STUFF(REPLACE(REPLACE(
(
SELECT value FROM tb N
WHERE id = A.id
FOR XML AUTO
), ' <N value="', ','), '"/>', ''), 1, 1, '')
)N
drop table tb

/*
id values
----------- -----------
1 aa,bb
2 aaa,bbb,ccc

(2 行受影响)
*/

--SQL2005中的方法2
create table tb(id int, value varchar(10))
insert into tb values(1, 'aa')
insert into tb values(1, 'bb')
insert into tb values(2, 'aaa')
insert into tb values(2, 'bbb')
insert into tb values(2, 'ccc')
go

select id, [values]=stuff((select ','+[value] from tb t where id=tb.id for xml path('')), 1, 1, '')
from tb
group by id

/*
id values
----------- --------------------
1 aa,bb
2 aaa,bbb,ccc

(2 row(s) affected)

*/

drop table tb

ljy19831224 2008-11-14
  • 打赏
  • 举报
回复
[我测试了一下sdhylj 的脚本可以实现此功能 小小的改了一下!学习中!!! ]

declare @str varchar(8000)
set @str=''
select @str= @str + '/'+rtrim(isnull(a.ord_nbr,'')) + '(' + rtrim(isnull(a.ord_seq,'')) +')'
from trd_ord a
where a.ord_nbr = 'ORD0807003';
select stuff(@str,1,1,'');
zyf32145 2008-11-13
  • 打赏
  • 举报
回复
[Quote=引用 16 楼 sdhylj 的回复:]
对于你的问题,如下代码就可以解决,希望你先测试一下.

SQL code
declare @str varchar(8000)
set @str=''
select @str='/'+rtrim(isnull(a.ord_nbr,'')) + '(' + rtrim(isnull(a.ord_seq,'')) +')' aa
from trd_ord a
where a.ord_nbr
in
(select ord_nbr from trd_ord where ord_nbr = 'ORD0807003');
select stuff(@str,1,1,'');
[/Quote]

这种方法是可以的!
我是比较无聊,想试试看找不找的到像你给的"行列转换的方法"一样,不定义变量就出来了!

select name 姓名,
max(case subject when '语文' then result else 0 end) 语文,
max(case subject when '数学' then result else 0 end) 数学,
max(case subject when '物理' then result else 0 end) 物理,
cast(avg(result*1.0) as decimal(18,2)) 平均分,
sum(result) 总分
from tb
group by name

如果知道怎么做了,以后做报表应该能解决很多问题了!
青锋-SS 2008-11-13
  • 打赏
  • 举报
回复
对于你的问题,如下代码就可以解决,希望你先测试一下.

declare @str varchar(8000)
set @str=''
select @str='/'+rtrim(isnull(a.ord_nbr,'')) + '(' + rtrim(isnull(a.ord_seq,'')) +')' aa
from trd_ord a
where a.ord_nbr
in
(select ord_nbr from trd_ord where ord_nbr = 'ORD0807003');
select stuff(@str,1,1,'');
zyf32145 2008-11-13
  • 打赏
  • 举报
回复
引用 12 楼 liubocy 的回复:
引用 10 楼 sdhylj 的回复:
引用 9 楼 liubocy 的回复:
sql中的行列转换,这个问的人太多了
还是有些区别的,楼主只是把结果简单的相连.


其实也是行列转换的运用,区别在一列和多列
实现起来就复杂了.

我是完完全全的做不出来!
最麻烦的是,那二个字段是字符类型的,值可以是任何字符,没什么规律,没max给我取!
青锋-SS 2008-11-12
  • 打赏
  • 举报
回复
行列转换的方法,楼主可以参考一下

/*
普通行列转换
(爱新觉罗.毓华 2007-11-18于海南三亚)

假设有张学生成绩表(tb)如下:
Name Subject Result
张三 语文  74
张三 数学  83
张三 物理  93
李四 语文  74
李四 数学  84
李四 物理  94
*/

-------------------------------------------------------------------------
/*
想变成
姓名 语文 数学 物理
---------- ----------- ----------- -----------
李四 74 84 94
张三 74 83 93
*/

create table tb
(
Name varchar(10) ,
Subject varchar(10) ,
Result int
)

insert into tb(Name , Subject , Result) values('张三' , '语文' , 74)
insert into tb(Name , Subject , Result) values('张三' , '数学' , 83)
insert into tb(Name , Subject , Result) values('张三' , '物理' , 93)
insert into tb(Name , Subject , Result) values('李四' , '语文' , 74)
insert into tb(Name , Subject , Result) values('李四' , '数学' , 84)
insert into tb(Name , Subject , Result) values('李四' , '物理' , 94)
go

--静态SQL,指subject只有语文、数学、物理这三门课程。
select name 姓名,
max(case subject when '语文' then result else 0 end) 语文,
max(case subject when '数学' then result else 0 end) 数学,
max(case subject when '物理' then result else 0 end) 物理
from tb
group by name
/*
姓名 语文 数学 物理
---------- ----------- ----------- -----------
李四 74 84 94
张三 74 83 93
*/

--动态SQL,指subject不止语文、数学、物理这三门课程。
declare @sql varchar(8000)
set @sql = 'select Name as ' + '姓名'
select @sql = @sql + ' , max(case Subject when ''' + Subject + ''' then Result else 0 end) [' + Subject + ']'
from (select distinct Subject from tb) as a
set @sql = @sql + ' from tb group by name'
exec(@sql)
/*
姓名 数学 物理 语文
---------- ----------- ----------- -----------
李四 84 94 74
张三 83 93 74
*/

-------------------------------------------------------------------
/*加个平均分,总分
姓名 语文 数学 物理 平均分 总分
---------- ----------- ----------- ----------- -------------------- -----------
李四 74 84 94 84.00 252
张三 74 83 93 83.33 250
*/

--静态SQL,指subject只有语文、数学、物理这三门课程。
select name 姓名,
max(case subject when '语文' then result else 0 end) 语文,
max(case subject when '数学' then result else 0 end) 数学,
max(case subject when '物理' then result else 0 end) 物理,
cast(avg(result*1.0) as decimal(18,2)) 平均分,
sum(result) 总分
from tb
group by name
/*
姓名 语文 数学 物理 平均分 总分
---------- ----------- ----------- ----------- -------------------- -----------
李四 74 84 94 84.00 252
张三 74 83 93 83.33 250
*/

--动态SQL,指subject不止语文、数学、物理这三门课程。
declare @sql1 varchar(8000)
set @sql1 = 'select Name as ' + '姓名'
select @sql1 = @sql1 + ' , max(case Subject when ''' + Subject + ''' then Result else 0 end) [' + Subject + ']'
from (select distinct Subject from tb) as a
set @sql1 = @sql1 + ' , cast(avg(result*1.0) as decimal(18,2)) 平均分,sum(result) 总分 from tb group by name'
exec(@sql1)
/*
姓名 数学 物理 语文 平均分 总分
---------- ----------- ----------- ----------- -------------------- -----------
李四 84 94 74 84.00 252
张三 83 93 74 83.33 250
*/

drop table tb

---------------------------------------------------------
---------------------------------------------------------
/*
如果上述两表互相换一下:即

姓名 语文 数学 物理
张三 74  83  93
李四 74  84  94

想变成
Name Subject Result
---------- ------- -----------
李四 语文 74
李四 数学 84
李四 物理 94
张三 语文 74
张三 数学 83
张三 物理 93
*/

create table tb1
(
姓名 varchar(10) ,
语文 int ,
数学 int ,
物理 int
)

insert into tb1(姓名 , 语文 , 数学 , 物理) values('张三',74,83,93)
insert into tb1(姓名 , 语文 , 数学 , 物理) values('李四',74,84,94)

select * from
(
select 姓名 as Name , Subject = '语文' , Result = 语文 from tb1
union all
select 姓名 as Name , Subject = '数学' , Result = 数学 from tb1
union all
select 姓名 as Name , Subject = '物理' , Result = 物理 from tb1
) t
order by name , case Subject when '语文' then 1 when '数学' then 2 when '物理' then 3 when '总分' then 4 end

--------------------------------------------------------------------
/*加个平均分,总分
Name Subject Result
---------- ------- --------------------
李四 语文 74.00
李四 数学 84.00
李四 物理 94.00
李四 平均分 84.00
李四 总分 252.00
张三 语文 74.00
张三 数学 83.00
张三 物理 93.00
张三 平均分 83.33
张三 总分 250.00
*/

select * from
(
select 姓名 as Name , Subject = '语文' , Result = 语文 from tb1
union all
select 姓名 as Name , Subject = '数学' , Result = 数学 from tb1
union all
select 姓名 as Name , Subject = '物理' , Result = 物理 from tb1
union all
select 姓名 as Name , Subject = '平均分' , Result = cast((语文 + 数学 + 物理)*1.0/3 as decimal(18,2)) from tb1
union all
select 姓名 as Name , Subject = '总分' , Result = 语文 + 数学 + 物理 from tb1
) t
order by name , case Subject when '语文' then 1 when '数学' then 2 when '物理' then 3 when '平均分' then 4 when '总分' then 5 end

drop table tb1
青锋-SS 2008-11-12
  • 打赏
  • 举报
回复
[Quote=引用 12 楼 liubocy 的回复:]
引用 10 楼 sdhylj 的回复:
引用 9 楼 liubocy 的回复:
sql中的行列转换,这个问的人太多了
还是有些区别的,楼主只是把结果简单的相连.


其实也是行列转换的运用,区别在一列和多列
[/Quote]实现起来就复杂了.
zyf32145 2008-11-11
  • 打赏
  • 举报
回复
竟然是同一个表还要用in,直接写也行了!
where a.ord_nbr ='ORD0807003'

呵呵,我比较懒,开始这样写是为了希望自己能想起那句话,后来不想改了!
foreveris 2008-11-11
  • 打赏
  • 举报
回复

declare @t table (ord_nbr nvarchar(20),ord_seq nvarchar(6))

insert into @t
select 'ORD0807003','001' union all
select 'ORD0807003','002' union all
select 'ORD0807003','003'

--select * from @t
declare @sql nvarchar(1000)
set @sql = ''

select @sql = @sql + AA + '/' from
(select ord_nbr +'(' + ord_seq + ')' as AA from @t where ord_nbr = 'ORD0807003') a
set @sql = left(@sql,len(@sql)-1)

select top 1 @sql from @t

--查询结果
ORD0807003(001)/ORD0807003(002)/ORD0807003(003)

jlwei888 2008-11-11
  • 打赏
  • 举报
回复
竟然是同一个表还要用in,直接写也行了!
where a.ord_nbr ='ORD0807003'
青锋-SS 2008-11-11
  • 打赏
  • 举报
回复
上面少写东西的,改正如下

declare @str varchar(8000)
set @str=''
select @str=@str+'/'+a.ord_nbr + '(' + a.ord_seq +')' aa
from trd_ord a
where a.ord_nbr
in
(select ord_nbr from trd_ord where ord_nbr = 'ORD0807003');
select stuff(@str,1,1,'');
青锋-SS 2008-11-11
  • 打赏
  • 举报
回复

declare @str varchar(8000)
set @str=''
select @str='/'+a.ord_nbr + '(' + a.ord_seq +')' aa
from trd_ord a
where a.ord_nbr
in
(select ord_nbr from trd_ord where ord_nbr = 'ORD0807003');
select stuff(@str,1,1,'');

zyf32145 2008-11-11
  • 打赏
  • 举报
回复
写存储过程我也知道
只是我模糊记得以前有见过有人这样做过,一条SQL语句能把数据取成一排!
zyf32145 2008-11-11
  • 打赏
  • 举报
回复
用SQL语句没办法写出来吗!
在程序里实现我会,但是不能那么用!
jlwei888 2008-11-11
  • 打赏
  • 举报
回复
做成游标,读取结果放在一个字符串中
liubocy 2008-11-11
  • 打赏
  • 举报
回复
[Quote=引用 10 楼 sdhylj 的回复:]
引用 9 楼 liubocy 的回复:
sql中的行列转换,这个问的人太多了
还是有些区别的,楼主只是把结果简单的相连.
[/Quote]

其实也是行列转换的运用,区别在一列和多列
xxzys2008 2008-11-11
  • 打赏
  • 举报
回复
楼主的这个问题是否和下面的问题相近:

员工信息表中存在
1 张一
2 张二
3 张三
4 张四
… …
如何让其在数据窗口中并排显示?
张一  张二  张三  张四  …
…   …   …   …   …

在Sql Server 2000中用SQL可以做出来,但在数据窗口中怎么做?
青锋-SS 2008-11-11
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 liubocy 的回复:]
sql中的行列转换,这个问的人太多了
[/Quote]还是有些区别的,楼主只是把结果简单的相连.
加载更多回复(1)

740

社区成员

发帖
与我相关
我的任务
社区描述
PowerBuilder 脚本语言
社区管理员
  • 脚本语言社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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