TSQL, чтобы выбрать столбцы отличное значение, но показать строку с наименьшим количеством значений NULL - PullRequest
0 голосов
/ 28 июня 2018

У меня есть следующие столбцы

COL1 COL2   COL3    COL4
1    2      NULL    Value1
1    NULL   NULL    Value1
1    NULL   NULL    Value2
1    3      NULL    Value2

The result set I want is 

COL1    COL2    COL3    COL4
1        2      NULL    Value1
1        3      NULL    Value2

Логика заключается в том, что если в COL 4 имеется отдельное значение, оно должно отображаться, но только одна строка для каждого отдельного значения. В одной строке, которая должна отображаться, должно быть наименьшее количество столбцов, имеющих значение NULL, из всех строк с таким отличительным значением

Немного застрял на этом, любая помощь будет оценена.

1 Ответ

0 голосов
/ 28 июня 2018

Если вы применяете это к достаточно статичной таблице, вы можете применить row_number, сгруппированный по каждому значению Col4, упорядоченный по количеству других столбцов, которые не null:

declare @t table(Col1 int,Col2 int,Col3 int,Col4 nvarchar(6));
insert into @t values
 (1,2   ,NULL,'Value1')
,(1,NULL,NULL,'Value1')
,(1,NULL,NULL,'Value2')
,(1,3   ,NULL,'Value2')
;

with d as
(
    select Col1
            ,Col2
            ,Col3
            ,Col4
            ,row_number() over (partition by Col4
                                order by case when Col1 is null then 1 else 0 end
                                        +case when Col2 is null then 1 else 0 end
                                        +case when Col3 is null then 1 else 0 end
                               ) as rn
    from @t
)
select Col1
        ,Col2
        ,Col3
        ,Col4
from d
where rn = 1
;

Выход:

+------+------+------+--------+
| Col1 | Col2 | Col3 |  Col4  |
+------+------+------+--------+
|    1 |    2 | NULL | Value1 |
|    1 |    3 | NULL | Value2 |
+------+------+------+--------+
...