2016-10-01 1 views
1

Я хочу получить запись, имеющую нуль, если идентификатор имеет только одну запись и выбирает не пустое значение, если id имеет более одной записиВыберите запись с нулевым значением, если идентификатор имеет только одну запись и не имеет значения null, когда идентификатор имеет более одной записи.

Ниже приведен пример образца.

Id Field1 Field2 
1 Null 34 
1 Yes  52 
2 Null 56 
3 No  46 

и выход

Id Field1 Field2 
1 Yes 52 
2 Null 56 
3 No  46 

Как это можно сделать с помощью SQL-запроса?

+1

Что вы хотите, если есть несколько записей, но все они ноль? – Bohemian

+0

Или несколько записей не ноль? – dsz

ответ

1

Используйте следующий запрос для 2008+ версий SQL-сервера.

;with cte_1 
    As 
    (select *, count(1) over (partition by id order by id) Cnt 
    From YourTable) 
    Select Id,Field1,Field2 
    From Cte_1 
    Where Field1 is null and Cnt=1 
    UNION 
    Select Id,Field1,Field2 
    From YourTable 
    Where field1 is not null 

Пример вывода:

enter image description here

Используйте следующий запрос для версии 2005 года.

SELECT t.Id,Field1,Field2 
FROM #T t 
    JOIN (select ID, count(ID) CntId 
      From #t 
      GROUP BY ID 
      HAVING COUNT(ID)=1)t1 on t.ID=t1.ID 
WHERE t.Field1 is null 

    UNION 

SELECT Id,Field1,Field2 
FROM #T 
WHERE Field1 is NOT NULL 
ORDER BY ID 

Пример вывода:

enter image description here

+0

Спасибо за ответ. Но им становится ниже ошибки, это счет или Row_Number Msg 102, Level 15, State 1, Line 3 Неправильный синтаксис около 'order'. – user2514925

+0

, какую версию сервера sql вы используете? –

+0

см. Обновленный сценарий. –

0

Это звучит, как вы можете иметь только один или два ряда в каждой группе, и один из них должен иметь нуль. Используя эти предположения, вы можете избавиться от простого запроса.

select 
    Id, 
    min(Field1) as Field1, 
    coalesce(min(case when Field1 is not null then Field2 end), min(Field2)) as Field2 
from T 
group by Id 

Это также делает предположение, что незначительное Field2 не является обнуляемым. На самом деле это немного более тонко, чем это, но есть обходной путь, если вам это нужно.

Раствор с помощью exists и подзапрос другой вариант:

select * from T t1 
where Field is not null or not exists (
    select 1 from T t2 
    where t2.Id = t1.Id and t2.Field is not null 
) 
0

Используйте этот код:

Select Distinct ID, 
(Select Max(Field1) From Table1 Where ID=Tbl1.ID) as Field1, 
(Select Max(Field1) From Table1 Where ID=Tbl1.ID) as Field2 
From Table1 as Tbl1 

Результат:

ID   Field1  Field2 
----------- ---------- ----------- 
1   Yes  52 
2   NULL  56 
3   No   46 

(3 row(s) affected) 

Также ниже кода получить тот же результат:

Select Distinct ID, 
(Select Top 1 Field1 From Table1 Where ID=Tbl1.ID Order By Field1 Desc) as Field1, 
(Select Top 1 Field2 From Table1 Where ID=Tbl1.ID Order BY field1 Desc) as Field2 
From Table1 as Tbl1 
Смежные вопросы