求SQL语句

wangyanboq 2009-06-23 10:14:58
有表Address和PointPair。
Address和PointPair表结构均如下
Begin 字符串
End 字符串
A 字符串
B 字符串

假设Address表有以下数据
1 2 N M
1 2 B M
1 3 C D
1 4 B F

PointPair表有以下数据
1 2 N M
1 2 N C
1 3 C D

希望查询这样的结果
Begin End AddressInfo PointPairInfo
1 2 N/M B/M N/M N/C
1 3 C/D C/D
1 4 B/F 空串

SQL语句怎么写?
...全文
31 14 打赏 收藏 转发到动态 举报
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
ai_li7758521 2009-06-23
  • 打赏
  • 举报
回复
select [Begin],[End],AddressInfo=A+'/'+B
into #1
from Address

select [Begin],[End],PointPairInfo=A+'/'+B
into #2
from PointPair


select a.[Begin],a.[End]
,AddressInfo=stuff(b.AddressInfo.value('/R[1]','nvarchar(50)'),1,1,'')
,PointPairInfo=stuff(d.PointPairInfo.value('/R[1]','nvarchar(50)'),1,1,'')
from
(select distinct [Begin],[End] from #1) a
Cross apply
(select AddressInfo=(select N' '+AddressInfo
from #1
where [Begin]=a.[Begin] and a.[End]=[End] For XML PATH(''), ROOT('R'), TYPE))b

full join

(select distinct [Begin],[End] from #2) c
Cross apply
(select PointPairInfo=(select N' '+PointPairInfo
from #2
where [Begin]=c.[Begin] and c.[End]=[End] For XML PATH(''), ROOT('R'), TYPE))d

on a.[Begin]=c.[Begin] and c.[End]=a.[End]


Begin End AddressInfo PointPairInfo
---------- ---------- -------------------------------------------------- --------------------------------------------------
1 2 N/M B/M N/M N/C
1 3 C/D C/D
1 4 B/F NULL

(3 行受影响)
usher_gml 2009-06-23
  • 打赏
  • 举报
回复
create table Address([begin] varchar(10),[end] varchar(10),A varchar(10),B varchar(10))
insert Address
select '1', '2', 'N', 'M' union all
select '1', '2', 'B', 'M' union all
select '1', '3', 'C', 'D' union all
select '1', '4', 'B', 'F'
create table PointPair([begin] varchar(10),[end] varchar(10),A varchar(10),B varchar(10))
insert PointPair
select '1', '2', 'N', 'M' union all
select '1', '2', 'N', 'C' union all
select '1', '3', 'C', 'D'
go

CREATE FUNCTION dbo.f_Address(@id1 varchar(10),@id2 varchar(10))
RETURNS varchar(8000)
AS
BEGIN
DECLARE @str varchar(8000)
SET @str = ''
SELECT @str = @str + ' ' + [A+B]
FROM (select [begin],[end],A+'/'+B [A+B] from Address) tb
WHERE [begin]=@id1 and [end]=@id2
RETURN STUFF(@str, 1, 1, '')
END
GO
CREATE FUNCTION dbo.f_PointPair(@id1 varchar(10),@id2 varchar(10))
RETURNS varchar(8000)
AS
BEGIN
DECLARE @str varchar(8000)
SET @str = ''
SELECT @str = @str + ' ' + [A+B]
FROM (select [begin],[end],A+'/'+B [A+B] from PointPair) tb
WHERE [begin]=@id1 and [end]=@id2
RETURN STUFF(@str, 1, 1, '')
END
GO
select a.[begin],a.[end],AddressInfo,PointPairInfo
from
(SELECT [begin],[end], AddressInfo = dbo.f_Address([begin],[end]) FROM Address GROUP BY [begin],[end]) a left join
(SELECT [begin],[end], PointPairInfo = dbo.f_PointPair([begin],[end]) FROM PointPair GROUP BY [begin],[end]) b
on a.[begin]=b.[begin] and a.[end]=b.[end]

drop table Address
drop table PointPair
drop function dbo.f_Address
drop function dbo.f_PointPair
go
百年树人 2009-06-23
  • 打赏
  • 举报
回复
---测试数据---
if object_id('[Address]') is not null drop table [Address]
go
create table [Address]([Begin] int,[End] int,[A] varchar(1),[B] varchar(1))
insert [Address]
select 1,2,'N','M' union all
select 1,2,'B','M' union all
select 1,3,'C','D' union all
select 1,4,'B','F'
if object_id('[PointPair]') is not null drop table [PointPair]
go
create table [PointPair]([Begin] int,[End] int,[A] varchar(1),[B] varchar(1))
insert [PointPair]
select 1,2,'N','M' union all
select 1,2,'N','C' union all
select 1,3,'C','D'

---创建字符连接函数---
create function F_Str(@col1 int,@col2 int,@flag varchar(5))
returns nvarchar(30)
as
begin
declare @S nvarchar(30)
select
@S=isnull(@S+' ','')+[A]+'/'+[B]
from
(select *,'A' as FLAG from [Address]
UNION ALL
select *,'P' from [PointPair]
) t
where
[begin]=@col1 and [end]=@col2 and flag=@flag
return @S
end

---查询---
select
[Begin],
[End],
AddressInfo=max(case flag when 'A' then dbo.f_str([begin],[end],flag) else '' end),
PointPairInfo=max(case flag when 'P' then dbo.f_str([begin],[end],flag) else '' end)
from
(
select *,'A' as FLAG from [Address]
UNION ALL
select *,'P' from [PointPair]
)t
group by
[Begin],
[End]


---结果---
Begin End AddressInfo PointPairInfo
----------- ----------- ------------------------------ ------------------------------
1 2 N/M B/M N/M N/C
1 3 C/D C/D
1 4 B/F

(所影响的行数为 3 行)


--小F-- 2009-06-23
  • 打赏
  • 举报
回复
都让2楼说了
csdyyr 2009-06-23
  • 打赏
  • 举报
回复
left join +
SQL code问题描述:
无论是在sql 2000,还是在 sql 2005 中,都没有提供字符串的聚合函数,
所以,当我们在处理下列要求时,会比较麻烦:
有表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.1 新的解决方法
-- 示例数据
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 行受影响)
--*/
--2.2
DECLARE @TB TABLE([Name] VARCHAR(1), [Value] VARCHAR(6))
INSERT @TB
SELECT 'A', '123' UNION ALL
SELECT 'A', '677' UNION ALL
SELECT 'B', 'HHDA' UNION ALL
SELECT 'B', 'JYUKY' UNION ALL
SELECT 'B', 'WRWFCW' UNION ALL
SELECT 'B', 'YUYUY' UNION ALL
SELECT 'C', 'TRREER'

SELECT [Name],STUFF((SELECT ','+[Value] FROM @TB WHERE NAME=A.NAME FOR XML PATH('')),1,1,'') AS [Value]
FROM @TB AS A
GROUP BY [Name]
/*
Name Value
---- ------------------------------------------
A 123,677
B HHDA,JYUKY,WRWFCW,YUYUY
C TRREER
*/

--各种字符串分函数

--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 個資料列受到影響)

jwdream2008 2009-06-23
  • 打赏
  • 举报
回复
关注,帮顶!
usher_gml 2009-06-23
  • 打赏
  • 举报
回复
 合并列值 
--*******************************************************************************************
表结构,数据如下:
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中只能用函数解决。)
--=============================================================================
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
--1. 创建处理函数
CREATE FUNCTION dbo.f_strUnite(@id int)
RETURNS varchar(8000)
AS
BEGIN
DECLARE @str varchar(8000)
SET @str = ''
SELECT @str = @str + ',' + value FROM tb WHERE id=@id
RETURN STUFF(@str, 1, 1, '')
END
GO
-- 调用函数
SELECt id, value = dbo.f_strUnite(id) FROM tb GROUP BY id
drop table tb
drop function dbo.f_strUnite
go
/*
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



本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/usher_gml/archive/2009/04/27/4128092.aspx
wangyanboq 2009-06-23
  • 打赏
  • 举报
回复
结果有四列,其中AddressInfo和PointPairInfo分别是各自表的列数据组合成的字符串
feixianxxx 2009-06-23
  • 打赏
  • 举报
回复
-- =========================================
-- -----------t_mac 小编-------------
---希望有天成为大虾----
-- =========================================

if object_id('[Address]') is not null drop table [Address]
go
create table [Address]([Begin] int,[End] int,[A] varchar(1),[B] varchar(1))
insert [Address]
select 1,2,'N','M' union all
select 1,2,'B','M' union all
select 1,3,'C','D' union all
select 1,4,'B','F'
if object_id('[PointPair]') is not null drop table [PointPair]
go
create table [PointPair]([Begin] int,[End] int,[A] varchar(1),[B] varchar(1))
insert [PointPair]
select 1,2,'N','M' union all
select 1,2,'N','C' union all
select 1,3,'C','D'
go
if OBJECT_ID('poofly') is not null
drop function poofly
go
create function poofly(@n int,@n1 char(1),@n2 char(1))
returns varchar(100)
as
begin
declare @S nvarchar(30)

if(@n=1)
begin
select @S=isnull(@S+' ','')+[A]+'/'+[B]
from [address]
where [begin]=@n1 and [end]=@n2
end
else
begin
select @S=isnull(@S+' ','')+[A]+'/'+[B]
from PointPair
where [begin]=@n1 and [end]=@n2
end
return @s
end

go
select distinct a.[Begin],a.[End], AddressInfo=dbo.poofly(1,a.[begin],a.[end]),PointPairInfo= dbo.poofly(0,p.[begin],p.[end])
from [Address] a left join [PointPair] p on a.[Begin]=p.[Begin] and a.[End]=p.[End]
/*--------------------------
1 2 N/M B/M N/M N/C
1 3 C/D C/D
1 4 B/F NULL
---------------------------------------*/
xiequan2 2009-06-23
  • 打赏
  • 举报
回复
declare @address table ([begin] nvarchar(10), [end] nvarchar(10),a nvarchar(10),b nvarchar(10))
insert into @address select '1','2','n','m'
union all select '1','2','b','m'
union all select '1','3','c','d'
union all select '1','4','b','f'
declare @pointpair table ([begin] nvarchar(10), [end] nvarchar(10),a nvarchar(10),b nvarchar(10))
insert into @pointpair select '1','2','n','m'
union all select '1','2','n','c'
union all select '1','3','c','d'

;with cte1 as
(
select t1.[begin],t1.[end],t1.a+'/'+t1.b t1b,t2.a+'/'+t2.b t2b from @address t1 left join @pointpair t2 on t1.[begin]=t2.[begin] and t1.[end]=t2.[end]
)
select a.[begin],a.[end], AddressInfo=stuff((select distinct ' '+ t1b from cte1 where [begin]=a.[begin] and [end]=a.[end] for xml path('')),1,1,''),PointPairInfo=stuff((select distinct' '+ t2b from cte1 where [begin]=a.[begin] and [end]=a.[end] for xml path('')),1,1,'')
from cte1 a group by [begin],[end]

/*begin end AddressInfo PointPairInfo
1 2 b/m n/m n/c n/m
1 3 c/d c/d
1 4 b/f NULL
*/
lulu0126 2009-06-23
  • 打赏
  • 举报
回复
mark
Jamin_Liu 2009-06-23
  • 打赏
  • 举报
回复
--測試數據
declare @Address table([begin] varchar(10),[end] varchar(10),A varchar(10),B varchar(10))
insert @Address
select '1', '2', 'N', 'M' union all
select '1', '2', 'B', 'M' union all
select '1', '3', 'C', 'D' union all
select '1', '4', 'B', 'F'
declare @PointPair table([begin] varchar(10),[end] varchar(10),A varchar(10),B varchar(10))
insert @PointPair
select '1', '2', 'N', 'M' union all
select '1', '2', 'N', 'C' union all
select '1', '3', 'C', 'D'
--查詢
select rst1.*
,rst2.PointPairInfo
from (
select [begin]
,[end]
,STUFF(
(select ' '+A+'/'+B as [text()]
from @Address
where t1.[begin]=[begin] and t1.[end]=[end]
for xml path('')
)
,1,1,'') as AddressInfo
from @Address t1
group by [begin],[end]
) rst1
left join
(
select [begin]
,[end]
,STUFF(
(select ' '+A+'/'+B as [text()]
from @PointPair
where t1.[begin]=[begin] and t1.[end]=[end]
for xml path('')
)
,1,1,'') as PointPairInfo
from @PointPair t1
group by [begin],[end]
) rst2
on rst1.[begin]=rst2.[begin] and rst1.[end]=rst2.[end]
ChinaJiaBing 2009-06-23
  • 打赏
  • 举报
回复


declare @address table ([begin] nvarchar(10), [end] nvarchar(10),a nvarchar(10),b nvarchar(10))
insert into @address select '1','2','n','m'
union all select '1','2','b','m'
union all select '1','3','c','d'
union all select '1','4','b','f'
declare @pointpair table ([begin] nvarchar(10), [end] nvarchar(10),a nvarchar(10),b nvarchar(10))
insert into @pointpair select '1','2','n','m'
union all select '1','2','n','c'
union all select '1','3','c','d'
select a.[begin],a.[end],a.addressinfo,b.addressinfo as pointpairinfo from
(select [begin],[end],addressinfo=stuff( (select '/'+a +'/'+ b from @address where a.[end]=[end] and a.[begin]=[begin] for xml path('')),1,1,'') from @address a
group by [begin],[end]) a left join
(select [begin],[end],addressinfo=stuff( (select '/'+a +'/'+ b from @pointpair where a.[end]=[end] and a.[begin]=[begin] for xml path('')),1,1,'') from @pointpair a
group by [begin],[end]) b on a.[begin]=b.[begin] and a.[end]=b.[end]





(4 行受影响)

(3 行受影响)
begin end addressinfo pointpairinfo
---------- ---------- ---------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------- ----------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------------
1 2 n/m/b/m n/m/n/c
1 3 c/d c/d
1 4 b/f NULL

(3 行受影响)



zzz1975 2009-06-23
  • 打赏
  • 举报
回复
学习,支持并灌水

34,588

社区成员

发帖
与我相关
我的任务
社区描述
MS-SQL Server相关内容讨论专区
社区管理员
  • 基础类社区
  • 二月十六
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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