Добро пожаловать в форум, Guest  >>   Войти | Регистрация | Поиск | Правила | В избранное | Подписаться
Все форумы / Microsoft SQL Server Новый топик    Ответить
 И снова совмещение строк  [new]
andrej2005
Member

Откуда:
Сообщений: 142
Понимаю, что тема изъеденная до нельзя, но все равно я не могу найти решение в предыдущих постах.
Дана таблица, точнее это конечный результирующий запрос, но я упростил до таблицы:
DECLARE @TAB TABLE ([shkaf_A] [nvarchar](50) NULL,
                    [rad_zagimov_A] [nvarchar](50) NULL,
                    [zagim_A] [nvarchar](50) NULL,
		    [kabel_A] [nvarchar](50) NULL,
		    [shkaf_B] [nvarchar](50) NULL,
		    [rad_zagimov_B] [nvarchar](50) NULL,
		    [zagim_B] [nvarchar](50) NULL,
		    [kabel_B] [nvarchar](50) NULL,
		    [shkaf_C] [nvarchar](50) NULL,
		    [rad_zagimov_C] [nvarchar](50) NULL,
		    [zagim_C] [nvarchar](50) NULL)					
insert into @TAB values         
('A', 'AA', 'AA1', 'KAB1', 'B', 'BB', 'BB1', '', '', '', ''),
('', '', '', '', 'B', 'BB', 'BB1', 'KAB2', 'C', 'CC', 'CC1'),
('A', 'AA', 'AA2', 'KAB3', 'B', 'BB', 'BB2', '', '', '', ''),
('', '', '', '', 'B', 'BB', 'BB3', 'KAB4', 'C', 'CC', 'CC2')
select * from @TAB;


получиться должно это:
shkaf_Arad_zagimov_Azagim_Akabel_Ashkaf_Brad_zagimov_Bzagim_Bkabel_Bshkaf_Crad_zagimov_Czagim_C
AAAAA1KAB1BBBBB1KAB2CCCCC1
AAAAA2KAB3BBBBB2NULLNULLNULLNULL
NULLNULLNULLNULLBBBBB3KAB4CCCCC2


делаю так, но там появляются лишние строки, которые мне мешают:
SELECT 
	x1.[shkaf_A],
	x1.[rad_zagimov_A],
	x1.[zagim_A],
	x1.[kabel_A],
	x1.[shkaf_B],
	x1.[rad_zagimov_B],
	x1.[zagim_B],
	x1.[kabel_B],
	x2.[shkaf_C],
	x2.[rad_zagimov_C],
	x2.[zagim_C]
from @TAB AS x1
LEFT JOIN @TAB AS x2
ON	x1.[shkaf_B]=		x2.[shkaf_B] AND
	x1.[rad_zagimov_B]=	x2.[rad_zagimov_B] AND
	x1.[zagim_B]=		x2.[zagim_B]
ORDER BY [shkaf_B], [rad_zagimov_B], [zagim_B]	
3 дек 13, 13:59    [15231798]     Ответить | Цитировать Сообщить модератору
 Re: И снова совмещение строк  [new]
iap
Member

Откуда: Москва
Сообщений: 47145
Ну так у Вас две первые строки имеют совершенно одинаковые ([shkaf_B],[rad_zagimov_B],[zagim_B]).
Это приводит к декартову произведению.
3 дек 13, 15:25    [15232722]     Ответить | Цитировать Сообщить модератору
 Re: И снова совмещение строк  [new]
andrej2005
Member

Откуда:
Сообщений: 142
да, я это понял, но как выкрутиться?
3 дек 13, 15:38    [15232845]     Ответить | Цитировать Сообщить модератору
 Re: И снова совмещение строк  [new]
andrej2005
Member

Откуда:
Сообщений: 142
Именно эти две строки представляют один зажим, который подключен слева и справа. Если зажим подключен только с одной стороны, то такой зажим в ДБ представлен только одной строкой.
3 дек 13, 15:51    [15233004]     Ответить | Цитировать Сообщить модератору
 Re: И снова совмещение строк  [new]
andrej2005
Member

Откуда:
Сообщений: 142
А мне необходимо из этих двух строк сделать одну.
3 дек 13, 15:52    [15233023]     Ответить | Цитировать Сообщить модератору
 Re: И снова совмещение строк  [new]
bormental
Member

Откуда:
Сообщений: 90
Как то вот так примерно..

select
   case when t1.cnt=2
       then case when t1.shkaf_A='' then x2.shkaf_A else t1.shkaf_A end
       else t1.shkaf_A 
   end as shkaf_A
  ,case when t1.cnt=2
       then case when t1.rad_zagimov_A='' then  x2.rad_zagimov_A else t1.rad_zagimov_A end
       else t1.rad_zagimov_A
   end as rad_zagimov_A   
  ,case when t1.cnt=2
       then case when t1.zagim_A='' then x2.zagim_A else t1.zagim_A end
       else t1.zagim_A
   end as zagim_A
  ,case when t1.cnt=2
       then case when t1.kabel_A='' then x2.kabel_A else t1.kabel_A end
       else t1.kabel_A
   end as kabel_A
  ,case when t1.cnt=2
       then case when t1.shkaf_B='' then x2.shkaf_B else t1.shkaf_B end
       else t1.shkaf_B
   end as shkaf_B      
  ,case when t1.cnt=2
       then case when t1.rad_zagimov_B='' then x2.rad_zagimov_B else t1.rad_zagimov_B end
       else t1.rad_zagimov_B
   end as rad_zagimov_B      
  ,case when t1.cnt=2
       then case when t1.zagim_B='' then x2.zagim_B else t1.zagim_B end
       else t1.zagim_B
   end as zagim_B 
  ,case when t1.cnt=2
       then case when t1.kabel_B='' then x2.kabel_B else t1.kabel_B end
       else t1.kabel_B
   end as kabel_B 
  ,case when t1.cnt=2
       then case when t1.shkaf_C='' then x2.shkaf_C else t1.shkaf_C end
       else t1.shkaf_C
   end as shkaf_c
  ,case when t1.cnt=2
       then case when t1.rad_zagimov_C='' then x2.rad_zagimov_C else t1.rad_zagimov_C end
       else t1.rad_zagimov_C
   end as rad_zagimov_C    
  ,case when t1.cnt=2
       then case when t1.zagim_C='' then x2.zagim_C else t1.zagim_C end
       else t1.zagim_C
   end as zagim_C
  --,t1.cnt     
  from 
(
 select
	x1.[shkaf_A],
	x1.[rad_zagimov_A],
	x1.[zagim_A],
	x1.[kabel_A],
	x1.[shkaf_B],
	x1.[rad_zagimov_B],
	x1.[zagim_B],
	x1.[kabel_B],
    x1.[rad_zagimov_C],
	x1.[zagim_C],
	x1.[shkaf_c],
	COUNT(*) over(PARTITION by x1.shkaf_B,x1.rad_zagimov_B,x1.zagim_B ) as cnt
from @TAB AS x1   
) t1 
LEFT JOIN @TAB AS x2
ON	t1.[shkaf_B]=		x2.[shkaf_B] AND
	t1.[rad_zagimov_B]=	x2.[rad_zagimov_B] AND
	t1.[zagim_B]=		x2.[zagim_B] and
	(
	      t1.shkaf_A<>x2.shkaf_A
	  and t1.rad_zagimov_A<>x2.rad_zagimov_A
	  and t1.zagim_A<>x2.zagim_A
	  and t1.kabel_A<>x2.kabel_A
	  and t1.kabel_B<>x2.kabel_B
	  and t1.rad_zagimov_C<>x2.rad_zagimov_C
	  and t1.shkaf_C<>x2.shkaf_C
	  and t1.zagim_C<>x2.zagim_C
	)
	
	GROUP BY 
	   case when t1.cnt=2
       then case when t1.shkaf_A='' then x2.shkaf_A else t1.shkaf_A end
       else t1.shkaf_A 
   end
  ,case when t1.cnt=2
       then case when t1.rad_zagimov_A='' then  x2.rad_zagimov_A else t1.rad_zagimov_A end
       else t1.rad_zagimov_A
   end    
  ,case when t1.cnt=2
       then case when t1.zagim_A='' then x2.zagim_A else t1.zagim_A end
       else t1.zagim_A
   end    
  ,case when t1.cnt=2
       then case when t1.kabel_A='' then x2.kabel_A else t1.kabel_A end
       else t1.kabel_A
   end    
  ,case when t1.cnt=2
       then case when t1.shkaf_B='' then x2.shkaf_B else t1.shkaf_B end
       else t1.shkaf_B
   end       
  ,case when t1.cnt=2
       then case when t1.rad_zagimov_B='' then x2.rad_zagimov_B else t1.rad_zagimov_B end
       else t1.rad_zagimov_B
   end       
  ,case when t1.cnt=2
       then case when t1.zagim_B='' then x2.zagim_B else t1.zagim_B end
       else t1.zagim_B
   end  
   
  ,case when t1.cnt=2
       then case when t1.kabel_B='' then x2.kabel_B else t1.kabel_B end
       else t1.kabel_B
   end
  ,case when t1.cnt=2
       then case when t1.shkaf_C='' then x2.shkaf_C else t1.shkaf_C end
       else t1.shkaf_C
   end  
  ,case when t1.cnt=2
       then case when t1.rad_zagimov_C='' then x2.rad_zagimov_C else t1.rad_zagimov_C end
       else t1.rad_zagimov_C
   end     
  ,case when t1.cnt=2
       then case when t1.zagim_C='' then x2.zagim_C else t1.zagim_C end
       else t1.zagim_C
   end   

   order by
   case when t1.cnt=2
       then case when t1.shkaf_B='' then x2.shkaf_B else t1.shkaf_B end
       else t1.shkaf_B
   end       
  ,case when t1.cnt=2
       then case when t1.rad_zagimov_B='' then x2.rad_zagimov_B else t1.rad_zagimov_B end
       else t1.rad_zagimov_B
   end       
  ,case when t1.cnt=2
       then case when t1.zagim_B='' then x2.zagim_B else t1.zagim_B end
       else t1.zagim_B
   end  
3 дек 13, 17:19    [15233869]     Ответить | Цитировать Сообщить модератору
 Re: И снова совмещение строк  [new]
o-o
Guest
медвежуть какая-то,
но если просто подогнать ответ, то вот:

DECLARE @TAB TABLE ([shkaf_A] [nvarchar](50) NULL,
                    [rad_zagimov_A] [nvarchar](50) NULL,
                    [zagim_A] [nvarchar](50) NULL,
		    [kabel_A] [nvarchar](50) NULL,
		    [shkaf_B] [nvarchar](50) NULL,
		    [rad_zagimov_B] [nvarchar](50) NULL,
		    [zagim_B] [nvarchar](50) NULL,
		    [kabel_B] [nvarchar](50) NULL,
		    [shkaf_C] [nvarchar](50) NULL,
		    [rad_zagimov_C] [nvarchar](50) NULL,
		    [zagim_C] [nvarchar](50) NULL)					
insert into @TAB values         
('A', 'AA', 'AA1', 'KAB1', 'B', 'BB', 'BB1', NULL, NULL, NULL, NULL),
(NULL, NULL, NULL, NULL, 'B', 'BB', 'BB1', 'KAB2', 'C', 'CC', 'CC1'),
('A', 'AA', 'AA2', 'KAB3', 'B', 'BB', 'BB2', NULL, NULL, NULL, NULL),
(NULL, NULL, NULL, NULL, 'B', 'BB', 'BB3', 'KAB4', 'C', 'CC', 'CC2')


;with 
A as(
select *
from @TAB where shkaf_A is not null),

B as (
select *
from @TAB where kabel_B is not null)

select
	x1.[shkaf_A],
	x1.[rad_zagimov_A],
	x1.[zagim_A],
	x1.[kabel_A],
	x1.[shkaf_B],
	isnull(x1.[rad_zagimov_B], x2.[rad_zagimov_B]) as rad_zagimov_B, 
	isnull(x1.[zagim_B], x2.[zagim_B]) as zagim_B,
	isnull(x1.[kabel_B], x2.[kabel_B]) as kabel_B,
	x2.[shkaf_C],
	x2.[rad_zagimov_C],
	x2.[zagim_C]
from A x1 full join B x2
      on x1.[shkaf_B]=		x2.[shkaf_B] AND
	x1.[rad_zagimov_B]=	x2.[rad_zagimov_B] AND
	x1.[zagim_B]=		x2.[zagim_B]
---------------------------------------------------------------------
shkaf_A	rad_zagimov_A	zagim_A	kabel_A	shkaf_B	rad_zagimov_B	zagim_B	kabel_B	shkaf_C	rad_zagimov_C	zagim_C
A	AA	AA1	KAB1	B	BB	BB1	KAB2	C	CC	CC1
A	AA	AA2	KAB3	B	BB	BB2	NULL	NULL	NULL	NULL
NULL	NULL	NULL	NULL	NULL	BB	BB3	KAB4	C	CC	CC2
3 дек 13, 18:35    [15234502]     Ответить | Цитировать Сообщить модератору
 Re: И снова совмещение строк  [new]
andrej2005
Member

Откуда:
Сообщений: 142
Ого! Щас будем разбираться!
3 дек 13, 19:12    [15234711]     Ответить | Цитировать Сообщить модератору
 Re: И снова совмещение строк  [new]
andrej2005
Member

Откуда:
Сообщений: 142
Спасибо, все гениальное просто!
Я только тут немного исправил ошибочку:
	isnull(x1.[shkaf_B], x2.[shkaf_B]) as shkaf_B, 
	isnull(x1.[rad_zagimov_B], x2.[rad_zagimov_B]) as rad_zagimov_B, 
	isnull(x1.[zagim_B], x2.[zagim_B]) as zagim_B,
	x2.[kabel_B],
4 дек 13, 18:14    [15241463]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить