2014-12-01 2 views
0

я получил таблицу в SQL Server 2008, глядя, как этотГруппа строк с пропущенными значениями в каждой строке

FIELD1;FIELD2;FIELD3;FIELD4 
------------------------------- 
TEST1 ;AAAAAA;NULL ;NULL 
TEST1 ;NULL ;BBBBBB;NULL 
TEST1 ;NULL ;NULL ;CCCC 
TEST2 ;XXXXXX;NULL ;NULL 
TEST2 ;NULL ;YYYYYY;NULL 
TEST2 ;NULL ;NULL ;ZZZZ 
TEST3 ;UUUUUU;VVVVVV;NULL 

, и я хочу результат:

FIELD1;FIELD2;FIELD3;FIELD4 
TEST1 ;AAAAAA;BBBBBB;CCCC 
TEST2 ;XXXXXX;YYYYYY;ZZZZ 
TEST3 ;UUUUUU;VVVVVV;NULL 

Есть хороший способ для достижения этой цели?

+0

возможно дубликат [Сжатие строк с нулями и дубликатов в единые строки] (http://stackoverflow.com/questions/923776/compress-rows-with-nulls-and-duplicates-into-single-rows) –

ответ

0

Простой способ сделать его достижения является использование подзапросов на выбор.

declare @MyTable table 
(
    FIELD1 varchar(50) 
    ,FIELD2 varchar(50) 
    ,FIELD3 varchar(50) 
    ,FIELD4 varchar(50) 
) 

insert into @MyTable values 
('TEST1', 'AAAAAA', NULL , NULL) 
,('TEST1', NULL , 'BBBBBB', NULL) 
,('TEST1', NULL , NULL , 'CCCC') 
,('TEST2', 'XXXXXX', NULL , NULL) 
,('TEST2', NULL ,'YYYYYY', NULL) 
,('TEST2', NULL ,NULL ,'ZZZZ') 
,('TEST3', 'UUUUUU','VVVVVV', NULL) 

select * from @MyTable t0 


select t1.FIELD1 
, (select top 1 t2.FIELD2 from @MyTable t2 where t2.FIELD2 is not null and t2.FIELD1 = t1.Field1) 
, (select top 1 t3.FIELD3 from @MyTable t3 where t3.FIELD3 is not null and t3.FIELD1 = t1.Field1) 
, (select top 1 t4.FIELD4 from @MyTable t4 where t4.FIELD4 is not null and t4.FIELD1 = t1.Field1) 
from @MyTable t1 
    group by t1.FIELD1 
+0

Спасибо за ваш ответ, это возвращает именно то, что мне нужно. Что делать, если у меня есть 30 полей и ~ 1mio строк. Разве не все подзаголовки сделают это действительно неэффективным? Будет ли это лучше, чем решение соединения в другом решении? – Catscrash

+0

Самый прочный? зависит от вашей схемы, идексов и т. д. Только кислотный тест может точно сказать. Но поскольку я использую top в этих подзапросах, я подозреваю, что это лучше, чем соединение с ауттером. Для полей 30+, возможно, цикл может улучшиться, просто поместив правильную логику и итерируя по этой таблице только один раз за строку – jean

0

статическое решение здесь:

SELECT a.FIELD1,a.FIELD2,b.FIELD3,c.FIELD4 
FROM YourTable a 
LEFT JOIN YourTable b ON a.FIELD1 = b.FIELD1 AND b.FIELD3 IS NOT NULL 
LEFT JOIN YourTable c ON a.FIELD1 = c.FIELD1 AND c.FIELD4 IS NOT NULL 
WHERE a.FIELD2 IS NOT NULL 
+0

К сожалению, он не работает, когда нет значения null для поля2, также он может умножать строки, если есть два не нуль в одном поле2-4 для одного и того же поля1 – jean

+0

OP хочет только топ 1 ПОЛЯ? это не в запросе ГЭС, или я не вижу его ... Я думаю, он только хочет не иметь нулей для каждой категории из поля1 ... – Matej

+0

Вы правы! Давайте посмотрим, что более соответствует требованиям OP. – jean

Смежные вопросы