КАК избежать повторяемых строк в результате запроса

AVRob
Дата: 11.02.2013 21:49:48
имеются таблица а со столбцами номер заказа orderid и название заказа

таблица goods со столбцами goods_id и goodsname

таблица agents со столбцами agents_id и agentname

с каждым заказом указаны товары и агенты (goodsLink и agentslink таблицы соответствий)

делается выборка по разным условиям.

В этом примере

declare @a table (orderid int,ordname nvarchar(50),ordstate nvarchar(50))
INSERT INTO @a VALUES
(1,'order 1','done'),(2,'order 2','done'),(3,'this is order 3','in progress'),
(4,'order 4','in progress'),(5,'order for repair','done')

declare @goodsLink table (order_id int,goodsid int)
INSERT INTO @goodsLink VALUES
(1,1),(1,2),(1,3),
(2,5),
(3,2),(3,3),(3,5),
(4,1),(4,5),
(5,2),(5,3)

declare @goods table (goods_id int,goodsname nvarchar(50))
INSERT INTO @goods VALUES
(1,'goods1'),(2,'goods 2'),(3,'this is goods 3'),
(4,'goods4'),(5,'goods 5')

declare @agentsLink table (order_id int,agentid int)
INSERT INTO @agentsLink VALUES
(1,1),(1,2),
(2,3),
(3,2),(3,3),(3,4),
(4,1),(4,3),
(5,2),(5,3)

declare @agents table (agent_id int,agentname nvarchar(50))
INSERT INTO @agents VALUES
(1,'Smith'),(2,'Adams'),(3,'Johnson'),
(4,'Paterson')

select a.ordname,a.ordstate,c.goodsname,e.agentname
from @a a
Left Outer Join @goodsLink b on b.order_id=a.orderid
Left outer Join @goods c on c.goods_id=b.goodsid
Left Outer Join @agentsLink d on d.order_id=a.orderid
Left outer Join @agents e on e.agent_id=d.agentid
where a.orderid>3
--where (e.agentname like 'Adams%')and (ordstate='done')

(условия выборки могут быть по разным столбцам)

-----------------------------
в результате имеем

ordname ordstate goodsname agentname
order 4 in progress goods1 Smith
order 4 in progress goods1 Johnson
order 4 in progress goods 5 Smith
order 4 in progress goods 5 Johnson
order for repair done goods 2 Adams
order for repair done goods 2 Johnson
order for repair done this is goods 3 Adams
order for repair done this is goods 3 Johnson


Как можно сделать так, чтоб в столбце ordname значения не повторялись
а вместо значений goodsname и agentname выдавал сумму этих знаечний, т.е.
результат иметь в виде:

ordname ordstate goodsname agentname
order 4 in progress goods1+goods 5 Smith+Johnson
order for repair done goods 2+this is goods 3 Adams+Johnson
Cygapb-007
Дата: 12.02.2013 00:06:33
;with sel as (
	select a.ordname,a.ordstate,c.goodsname,e.agentname
	from @a a
	Left Outer Join @goodsLink b on b.order_id=a.orderid
	Left outer Join @goods c on c.goods_id=b.goodsid
	Left Outer Join @agentsLink d on d.order_id=a.orderid
	Left outer Join @agents e on e.agent_id=d.agentid
	where a.orderid>3
	--where (e.agentname like 'Adams%')and (ordstate='done')
	)
select s.ordname,s.ordstate, 
	stuff((
		select '+'+a.goodsname
		from sel a
		where a.ordname=s.ordname and a.ordstate=s.ordstate
		group by a.goodsname
		order by a.goodsname
		for xml path(''),type 
		).value('.', 'nvarchar(max)'),1,1,'') goodsname,
	stuff((
		select '+'+a.agentname
		from sel a
		where a.ordname=s.ordname and a.ordstate=s.ordstate
		group by a.agentname
		order by a.agentname
		for xml path(''),type 
		).value('.', 'nvarchar(max)'),1,1,'') agentname
from sel s
group by s.ordname,s.ordstate
AVRob
Дата: 12.02.2013 00:25:04
Cygapb-007,

Спасибо, все четко ))