高分求教简单的SQL语句,顶者有分!
SQL Server:
表结构:
ID(编号),Name(XX名称)
在表中有如下数据:
1,A客户
1,B供应商
2,C客户
2,D供应商
问题-通过视图生成如下表结构:
1,A客户,B供应商
2,C客户,D供应商
即:把表中ID相同的两条记录合并为一条记录。
问题点数:100、回复次数:56Top
1 楼mengzulin(Julian)回复于 2005-07-14 09:12:14 得分 3
create FUNCTION dbo.getPlus(@ID int)
RETURNS varchar(800)
AS
BEGIN
DECLARE @str varchar(800)
set @str=''
SELECT @str=@str+rtrim(Name)+','
FROM [dbo].[tablename]
where ID = @ID
order by str_ID
return @str
END
select [ID],getPlus(ID) from [table]Top
2 楼wpmxm(老三)回复于 2005-07-14 09:15:34 得分 3
select id,name,f_getclient(id) from table_name where name like '%客户%' order by id
自定义函数:
create function f_getclient(@id int )return varchar(50) as
begin
declare @clientname varchar(50)
select @clientname =name from table_name where id =@id and name like '%供应商%'
return @clientname
endTop
3 楼paoluo(一天到晚游泳的鱼)回复于 2005-07-14 09:19:28 得分 3
--建立测试环境
Create Table TEST
(ID Int,
Name Nvarchar(20))
Insert TEST Values(1,N'A客户')
Insert TEST Values(1,N'B供应商')
Insert TEST Values(2,N'C客户')
Insert TEST Values(2,N'D供应商')
GO
--建立函数
Create Function GetName(@ID Int)
Returns Nvarchar(1000)
As
Begin
Declare @S Nvarchar(1000)
Set @S=''
Select @S=@S+','+Name from TEST Where ID=@ID Order By Name
Return (Stuff(@S,1,1,''))
End
GO
--测试
Select ID,dbo.GetName(ID) As Name from TEST Group By ID
GO
--删除测试环境
Drop Table TEST
Drop Function GetName
--结果
/*
ID Name
1 A客户,B供应商
2 C客户,D供应商
*/
Top
4 楼hsj20041004(光芒)回复于 2005-07-14 09:22:19 得分 3
create table tb(id int,name varchar(10))
insert into tb select 1,'A客户'
union select 1,'B供应商'
union select 2,'C客户'
union select 2,'D供应商'
create FUNCTION dbo.getname(@as_ID int)
RETURNS varchar(1000)
AS
BEGIN
DECLARE @str varchar(1000)
set @str=''
SELECT @str=@str+','+rtrim(Name)
FROM tb
where ID = @as_ID
return stuff(@str,1,1,'')
END
select [ID],dbo.getname(ID) from tb group by id
结果:
ID
----------- -----------------------------------------------------------------------------
1 A客户,B供应商
2 C客户,D供应商
(所影响的行数为 2 行)Top
5 楼paoluo(一天到晚游泳的鱼)回复于 2005-07-14 09:22:34 得分 0
一二楼的都是错误的。Top
6 楼wangdehao(找找找(现在很幸福))回复于 2005-07-14 09:25:52 得分 3
create FUNCTION dbo.getPlus(@ID int)
RETURNS varchar(800)
AS
BEGIN
DECLARE @str varchar(800)
set @str=''
SELECT @str=@str+','+ltrim(rtrim(Name))
FROM [dbo].[tablename]
where ID = @ID
order by str_ID
set @str=stuff(@str,1,1,'')
return @str
END
select [ID],getPlus(ID) from [table]
---没测试
Top
7 楼qiuzhong1983(老丘)回复于 2005-07-14 09:32:23 得分 2
路过。Top
8 楼sxycgxj(云中客)回复于 2005-07-14 09:39:02 得分 2
鱼的方法可以Top
9 楼hglhyy(為人民币服务!)回复于 2005-07-14 09:44:56 得分 3
create table tab([id] char(1000),[name] char (1000))
insert into tab
select '1','A客户' union all
select '1','B供应商' union all
select '2','C客户' union all
select '2','D供应商'
CREATE FUNCTION dbo.get123(@ID int)
RETURNS varchar(1000)
AS
BEGIN
DECLARE @a varchar(1000)
set @a=''
SELECT @a=@a+','+rtrim([Name])
FROM tab
where [ID] = @ID
return stuff(@a,1,1,'')
END
select [ID],dbo.get123(ID) from tab group by [id]
--
ID
------------------ ----------
1 A客户,B供
2 C客户,D供
(所影响的行数为 2 行)
Top
10 楼hglhyy(為人民币服务!)回复于 2005-07-14 09:45:58 得分 2
真快! 简直是在抢啊Top
11 楼gimy007(逮猫的耗子)回复于 2005-07-14 09:49:26 得分 2
呵呵,俺来骗分的Top
12 楼lanbaibai(蓝白白)回复于 2005-07-14 09:50:15 得分 2
是的,看来高手太多了Top
13 楼xuelanghun(雪狼魂)回复于 2005-07-14 09:56:09 得分 2
upTop
14 楼xiaoxiangqing(肖祥清)回复于 2005-07-14 09:56:29 得分 3
if exists(select 1 from sysobjects where name='temp' and type='u')
drop table temp
if exists(select 1 from sysobjects where name='temp_view' and type='v')
drop view temp_view
if exists(select 1 from sysobjects where name='uf_temp' and type='FN')
drop function uf_temp
go
create table temp(id int,name varchar(20))
go
create function dbo.uf_temp(@id int)
returns varchar(1000)
as
begin
declare @str varchar(1000)
set @str=''
select @str=@str+','+name from temp where id=@id
if @str<>''
set @str=right(@str,len(@str)-1)
return @str
end
go
insert into temp
select 1,'A客户' union
select 1,'B供应商' union
select 2,'C客户' union
select 2,'D供应商'
go
select * from temp
go
/*
id name
1 A客户
1 B供应商
2 C客户
2 D供应商
*/
--select id from temp group by id
create view temp_view
as
select id,dbo.uf_temp(id) name from temp group by id
go
select * from temp_view
/*
id name
1 A客户,B供应商
2 C客户,D供应商
*/
Top
15 楼gimy007(逮猫的耗子)回复于 2005-07-14 09:56:39 得分 3
看了上面的自定义函数,提个小问题:
由于是Order By Name来排序的,那有没可能出现这样的结果呢?如:
1 A客户,B供应商
2 D供应商,C客户
这可能不符合实际的要求~~Top
16 楼progra(不学无数又富于幻想的人,虽有翅膀却无双脚)回复于 2005-07-14 09:57:55 得分 0
各位,我们为了数据库移植的考虑,不能使用存储过程,函数等,只能使用视图Top
17 楼progra(不学无数又富于幻想的人,虽有翅膀却无双脚)回复于 2005-07-14 10:00:23 得分 0
各位有没有不用函数,只有视图的方法Top
18 楼progra(不学无数又富于幻想的人,虽有翅膀却无双脚)回复于 2005-07-14 10:03:47 得分 0
1,A客户,B供应商
2,C客户,D供应商 意识是 ID,AName,BName
1,A客户,B供应商
2,C客户,D供应商Top
19 楼phantomMan()回复于 2005-07-14 10:20:56 得分 3
因为你上面的表结构没有关键字段,所以可以使用临时表;
但是无法在视图中使用临时表,这里仅做参考:
create table #t(Pid int identity,id int,name varchar(100))
insert into #t select * from tb
select a.id,a.name,b.name
from #t a,#t b
where a.id=b.id and a.name<>b.name and a.Pid%2=1
drop table #t
Top
20 楼KENJACK(心忆寒)回复于 2005-07-14 11:41:02 得分 2
就 为 了顶也有分Top
21 楼Yisa()回复于 2005-07-14 12:17:50 得分 2
真热闹, 高手们继续啦.
关注中....
Top
22 楼hemingliang()回复于 2005-07-14 12:28:17 得分 2
关注...........Top
23 楼progra(不学无数又富于幻想的人,虽有翅膀却无双脚)回复于 2005-07-14 12:32:02 得分 0
还是只用视图来实现的方法
生成的视图结构是:ID,AName,BName 即 1,A客户,B供应商 对应三列!
比较急~
Top
24 楼mengzulin(Julian)回复于 2005-07-14 12:39:20 得分 3
create FUNCTION dbo.getPlus(@ID int)
RETURNS varchar(800)
AS
BEGIN
DECLARE @str varchar(800)
set @str=''
SELECT @str=@str+rtrim(Name)+','
FROM [dbo].[tablename]
where ID = @ID
order by ID
return @str
END
select [ID],getPlus(ID) from [table]Top
25 楼rockyljt(江濤)回复于 2005-07-14 12:42:04 得分 2
upTop
26 楼vivianfdlpw()回复于 2005-07-14 12:50:03 得分 5
如果每个ID仅对应两个纪录:
--建立测试环境
if exists(select 1 from sysobjects where id=object_id('A') and xtype='U')
drop table A
go
create table A
(
ID Int,
Name nvarchar(20)
)
insert A values(1,N'A客户')
insert A values(1,N'B供应商')
insert A values(2,N'C客户')
insert A values(2,N'D供应商')
go
--创建视图
if exists(select 1 from sysobjects where id=object_id('v') and xtype='V')
drop view v
go
create view v
as
select T1.ID,[Name]=T2.name+','+T1.name
from
(select ID,[Name]=max(name) from A group by ID)T1
join
(select ID,[Name]=min(name) from A group by ID)T2
on T1.ID=T2.ID
go
--查看
select * from v
--删除测试环境
drop table A
drop view v
--结果
/*
ID Name
----------- -----------------------------------------
1 A客户,B供应商
2 C客户,D供应商
(所影响的行数为 2 行)
*/
Top
27 楼jixiaojie(太多借口)回复于 2005-07-14 12:55:08 得分 5
--有点牵强
create table temp(id int,name varchar(20))
insert into temp
select 1,'A客户' union
select 1,'B供应商' union
select 2,'C客户' union
select 2,'D供应商'
go
create view tempview
as
select t1.id,t1.name aname ,t2.name bname
from
(select * from temp
where name like '%客户'
)t1
join
(select * from temp
where name like '%供应商'
)t2
on t1.id =t2.id
go
select * from tempview
drop table temp
drop view tempview
/*
1 A客户 B供应商
2 C客户 D供应商
*/Top
28 楼progra(不学无数又富于幻想的人,虽有翅膀却无双脚)回复于 2005-07-14 16:37:39 得分 0
to vivianfdlpw():
三列啊~Top
29 楼tntzbzc(华裔大魔王—抗日要从娃娃抓起)回复于 2005-07-14 16:51:49 得分 2
select a.id,a.name,b.name from tb a left join tb b on a.id=b.id and a.name<>b.name where right(a.name,2)='客户' and right(b.name,3)='供应商'Top
30 楼vivianfdlpw()回复于 2005-07-14 17:11:31 得分 5
如果每个ID仅对应两个纪录:
--建立测试环境
if exists(select 1 from sysobjects where id=object_id('A') and xtype='U')
drop table A
go
create table A
(
ID Int,
Name nvarchar(20)
)
insert A values(1,N'A客户')
insert A values(1,N'B供应商')
insert A values(2,N'C客户')
insert A values(2,N'D供应商')
go
--创建视图
if exists(select 1 from sysobjects where id=object_id('v') and xtype='V')
drop view v
go
create view v
as
select T1.ID,[Name1]=T2.name,[Name2]=T1.name
from
(select ID,[Name]=max(name) from A group by ID)T1
join
(select ID,[Name]=min(name) from A group by ID)T2
on T1.ID=T2.ID
go
--查看
select * from v
--删除测试环境
drop table A
drop view v
--结果
/*
ID Name1 Name2
----------- -------------------- --------------------
1 A客户 B供应商
2 C客户 D供应商
(所影响的行数为 2 行)
*/
Top
31 楼Yisa()回复于 2005-07-14 17:27:36 得分 3
試下面的語句,可以滿足樓主的要求.
create view view1
as
select a.id, min(a.name) name1, max(b.name) name2
from table a inner join (select * from table) b on a.id=b.id
group by a.id
go
Top
32 楼spdogntit(sp)回复于 2005-07-14 17:28:33 得分 1
up
Top
33 楼StarsRiver(学无止境)回复于 2005-07-14 21:47:03 得分 1
学习
Top
34 楼superqi1106(小琦)回复于 2005-07-14 21:54:56 得分 1
我也学习 呵呵 不错Top
35 楼Hopewell_Go(好的在后頭﹗希望更好﹗﹗)回复于 2005-07-14 22:26:46 得分 2
TO: paoluo(一天到晚游泳的鱼)
好像樓主不是那個意思
我的理解是
ID 客戶 供应商
1 A客户 B供应商
2 C客户 D供应商
不知道是不是這個意思
Top
36 楼Hopewell_Go(好的在后頭﹗希望更好﹗﹗)回复于 2005-07-14 22:28:53 得分 1
好久沒有上SQL了
最近一個多月的工作實豐是太忙了。
Top
37 楼xiaonvjing(飞扬)回复于 2005-07-15 06:12:49 得分 5
---建立测试环境:
create table table1(id int,name varchar(10))
insert into table1 select 1,'A客户'
union select 1,'B供应商'
union select 2,'C客户'
union select 2,'D供应商'
select * from table1
---创建满足条件的视图
create view a
as
select a.id id ,min(a.name) aname,b.name bname from table1 a
join (select id,max(name)name from table1 group by id )b
on a.id=b.id group by a.id,b.name
----显示所需的数据
select * from a
Top
38 楼paoluo(一天到晚游泳的鱼)回复于 2005-07-15 09:29:36 得分 2
回复人: Hopewell_Go(好的在后頭﹗希望更好﹗﹗) ( ) 信誉:98 2005-07-14 22:26:00 得分: 0
TO: paoluo(一天到晚游泳的鱼)
好像樓主不是那個意思
我的理解是
ID 客戶 供应商
1 A客户 B供应商
2 C客户 D供应商
不知道是不是這個意思
--------------
是,楼主是这个意思。
只是他开始那样写的,大家都误会了。Top
39 楼jamex(1 + 1 = 爱)回复于 2005-07-15 10:19:04 得分 2
正确答案来了:
select a.[ID], [ProviderName],[ClientName]
Form (
Select [ID],[Name] as [ProviderName] from [table] where [Name] like '%供应商%'
) as a
Inner Join
(
Select [ID],[Name] as [ClientName] from [table] where [Name] like '%客户%'
) as b
on a.[ID]=b.[ID]
Order by a.[ID]Top
40 楼mrjerrylin(求知)回复于 2005-07-15 10:51:55 得分 1
顶Top
41 楼booby_fly(飞无止境)回复于 2005-07-15 11:11:10 得分 1
学习Top
42 楼bluebirdme(烈焰あ寒星)回复于 2005-07-15 11:17:57 得分 1
飘过 ~~~~Top
43 楼netsapper(网络工兵)回复于 2005-07-15 12:52:44 得分 1
都答完了啊~~~Top
44 楼mengjuezhuren(梦觉主人)回复于 2005-07-15 13:04:56 得分 1
学习ING。。
Top
45 楼realjia(阿字良博)回复于 2005-07-15 13:10:40 得分 1
up,up……Top
46 楼ashei(老道)回复于 2005-07-15 13:20:35 得分 1
这才是正解
select id,min(name),max(name) from table1 group by id
,简单明了.反正楼主要求的视图只两列,正好一个max一个minTop
47 楼fox_xk(天使的歌)回复于 2005-07-15 13:24:17 得分 1
就是要 顶也有分Top
48 楼ashei(老道)回复于 2005-07-15 13:26:01 得分 1
如果要求一列客户一列供应商可以这样写
select id,
(select top 1 name from table1 a where a.id=b.id and a.name like '%客户%'),
(select top 1 name from table1 a where a.id=b.id and a.name like '%供应商%')
from table1 b group by idTop
49 楼ainterpol(猪都会的二进制-吃饭-睡觉)回复于 2005-07-15 13:52:14 得分 0
晚来了 不用我做啦Top
50 楼chenyuanzhong(阿肉)回复于 2005-07-15 16:43:39 得分 0
顶也有分。那就混点分了撒Top
51 楼shilei831115(柔石)回复于 2005-07-15 17:38:16 得分 0
顶也有分Top
52 楼netfloator(Adam Lee)回复于 2005-07-15 21:36:10 得分 2
哈哈!向不拿分都不行了!
我这个最简单,楼主一定要多给分哦!
create table custum(cid int,cname varchar(20))
go
insert into custum values (1,'a')
insert into custum values (1,'b')
insert into custum values (2,'c')
insert into custum values (2,'d')
go
select A.cid cust_ID,A.cname NAME1,B.cname NAME2 from custum A,custum B where A.cid=B.cid and A.cname<>B.cname
and A.cname=(select top 1 C.cname from custum C where C.cid=A.cid)
go
drop table custum
go
cust_ID NAME1 NAME2
----------- -------------------- --------------------
1 a b
2 c dTop
53 楼netfloator(Adam Lee)回复于 2005-07-15 21:38:09 得分 1
不好意思,刚刚搞错了,不过只要把查询放到创建视图的语句中去就行了!Top
54 楼netfloator(Adam Lee)回复于 2005-07-15 21:41:36 得分 1
我想这个a客户,b供应商只是代名词吧,可以是任意的,只是要求每个id的第一个为客户,第二个为供应商。Top
55 楼filebat(Mark)回复于 2005-07-15 21:43:25 得分 1
楼主,怎么还不结帖啊.
热得不行了.
要换点新鲜血液才行啊.
大家不要老在一个老问题的纠缠啊.Top
56 楼brother2605(幽灵)回复于 2005-07-16 10:56:59 得分 1
up 学习啊Top




