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

Откуда: Москва
Сообщений: 72
Ситуация такая. Есть запрос, который выдает список необходимых полей в одной определенной таблице. По сути - это реквизиты в программе.
Дальше нужно этот список перебрать, а именно:
Используется вид аналитики (VID). Нужно как-то понять, заполнены ли эти поля у одного VID, и не используются в другом VID. А другое поле использует другой VID, но не использует первый VID. И схлопнуть в один.
Т.е. если схематично, то вот:
VID | R1 | R2 | R3 | ... и т.д.
123 | 1 |Null|Null|
124 |Null | 2 |Null|
234 |Null |Null| 3 |
.... и т.д.

Т.е. тут по схеме видно - что можно схлопнуть это все дело в R1, перенеся информацию из R2 и R3. VID нужно сначала считать с этой же таблицы.
Так же нужно найти неиспользуемые поля (у которых везде Null) так же их отобразить для информации, что их можно удалить.

Явно тут нужно через временные таблицы.
26 дек 15, 10:58    [18612893]     Ответить | Цитировать Сообщить модератору
 Re: Помогите реализовать запрос на поиск пустых columns и схлопнуть несколько полей в один  [new]
aleks2
Guest
VID | R1 | R2 | R3 | ... и т.д.
123 | 1 |Null|Null|
124 |Null | 2 |Null|
234 |Null |Null| 3 |
127 |Null |Null| 3 |
523 | 8 |Null|Null|
824 |Null | 2 |Null|

Кого с кем "схлапывать"?
26 дек 15, 12:06    [18613009]     Ответить | Цитировать Сообщить модератору
 Re: Помогите реализовать запрос на поиск пустых columns и схлопнуть несколько полей в один  [new]
Jhonny-2005
Member

Откуда: Москва
Сообщений: 72
aleks2,

В этом случае выходит схлопнуть нужно все в один. R1, R2 и R3.
Т.е. чтобы не было наложений.

Возможно будет лучше так объяснить.
VID - это ИД справочника. В котором могут использоваться эти реквизиты (которые разнесены по полям).
Каждый реквизит может хранить данные. Т.е. суть в том, чтобы не плодить эти поля под реквизиты, а использовать имеющиеся реквизиты.
Пример того, когда схлопнуться все в один не получиться:

VID | R1 | R2 | R3 | R4 |... и т.д.
123 | 1 | 2 |Null| Null |
124 |Null | 2 |Null| 4 |
234 | 3 |Null| 3 | Null |
127 |Null |Null| 3 | Null |
523 | 8 |Null| 8 | Null |
824 |Null | 2 |Null| Null |

Но получится схлопнуть
R1 и R2,
Или R2 и R3,
или (и) R3 и R4.

Возможно потом еще схлопнутые пересмотреть и что то еще с чем то схлопнуть по такому же принципу.
Т.е. они когда друг на друга накладываются хоть одно значение из (R1, R2...) в рамках одного VID, тогда схлопнуть нельзя.
26 дек 15, 13:17    [18613066]     Ответить | Цитировать Сообщить модератору
 Re: Помогите реализовать запрос на поиск пустых columns и схлопнуть несколько полей в один  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21249
Просто распивотьте свою таблицу и перейдите к псевдо-EAV. NULL-ы съе уйдут сами.
26 дек 15, 13:43    [18613094]     Ответить | Цитировать Сообщить модератору
 Re: Помогите реализовать запрос на поиск пустых columns и схлопнуть несколько полей в один  [new]
3unknown
Member

Откуда: New York
Сообщений: 140
Create table #tmp(VID int, R1 int, R2 int, R3 int,R4 int)

insert #tmp
select 123 , 1 , 2 ,Null, Null
union
select  124 ,Null , 2 ,Null, 4 
union
select 234 , 3 ,Null, 3 , Null 
union
select 127 ,Null ,Null, 3 , Null 
union
select 523 , 8 ,Null, 8 , Null 
union
select 824 ,Null , 2 ,Null, Null

select VID,R 
from
(select VID, R1,R2,R3,R4 from #tmp) as t
unpivot(R for Rs in (R1,R2,R3,R4)
) as t1
26 дек 15, 17:03    [18613371]     Ответить | Цитировать Сообщить модератору
 Re: Помогите реализовать запрос на поиск пустых columns и схлопнуть несколько полей в один  [new]
Akina
Member

Откуда: Зеленоград, Москва, Россия
Сообщений: 21249
Ну и если полные дубликаты не имеют смысла - то плюс DISTINCT.
26 дек 15, 17:23    [18613450]     Ответить | Цитировать Сообщить модератору
 Re: Помогите реализовать запрос на поиск пустых columns и схлопнуть несколько полей в один  [new]
схлопыватель,
Guest
ТС, "проникся" твоей "терминологией" :)
вот такое шота вышло ...

declare @t table (VID int, R1 int, R2 int, R3 int)

insert into @t
select 123 , 1 , Null, Null union all
select 124 , Null , 2 , Null union all
select 234 , Null , Null,  3 

--
;with cte as 
	(select (select * from @t for xml raw, elements, type) as x)
	
select 
	 t.c.value('*[1]/text()[1]', 'int') as VID	
	,t.c.value('*[2]/text()[1]', 'int') as R1	
	,t.c.value('*[3]/text()[1]', 'int') as R2	
	,t.c.value('*[4]/text()[1]', 'int') as R3	
from cte
cross apply cte.x.nodes('/row') as t(c)

--	
update @t set R1=8 where VID=234

--
;with cte as 
	(select (select * from @t for xml raw, elements, type) as x)
	
select 
	 t.c.value('*[1]/text()[1]', 'int') as VID	
	,t.c.value('*[2]/text()[1]', 'int') as R1	
	,t.c.value('*[3]/text()[1]', 'int') as R2	
	,t.c.value('*[4]/text()[1]', 'int') as R3	
from cte
cross apply cte.x.nodes('/row') as t(c)


(3 row(s) affected)
VID         R1          R2          R3
----------- ----------- ----------- -----------
123         1           NULL        NULL
124         2           NULL        NULL
234         3           NULL        NULL

(3 row(s) affected)

(1 row(s) affected)

VID         R1          R2          R3
----------- ----------- ----------- -----------
123         1           NULL        NULL
124         2           NULL        NULL
234         8           3           NULL

(3 row(s) affected)

но словарный запас - пополняй ...
26 дек 15, 18:54    [18613676]     Ответить | Цитировать Сообщить модератору
 Re: Помогите реализовать запрос на поиск пустых columns и схлопнуть несколько полей в один  [new]
3unknown
Member

Откуда: New York
Сообщений: 140
Create table #tmp(VID int, R1 int, R2 int, R3 int,R4 int)

insert #tmp
select 123 , 1 , 2 ,Null, Null
union
select  124 ,Null , 2 ,Null, 4 
union
select 234 , 3 ,Null, 3 , Null 
union
select 127 ,Null ,Null, 3 , Null 
union
select 523 , 8 ,Null, 8 , Null 
union
select 824 ,Null , 2 ,Null, Null
union
select 825 ,Null , null ,Null, Null

select* from(
select t.VID,t1.* 
from #tmp t 
cross apply(
values(R1),
	(R2),
	(R3),
	(R4)
) t1 (R)
) a where r is not null
27 дек 15, 04:09    [18614485]     Ответить | Цитировать Сообщить модератору
Все форумы / Microsoft SQL Server Ответить