Форум программистов, компьютерный форум, киберфорум
Наши страницы
Microsoft SQL Server
Войти
Регистрация
Восстановить пароль
 
Temper_sgy
8 / 3 / 1
Регистрация: 18.06.2013
Сообщений: 17
#1

Нахождение уникальных значений из таблицы по нескольким условиям - SQL Server

14.12.2016, 13:39. Просмотров 584. Ответов 6

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

Присутствует таблица с идентификатором и двумя параметрами.
Оба параметра могу быть заполнены, а также отсутствовать как вместе ,так и поодиночке.

IDpar1par2
id1aabb
id1aabb
id1aanull
id1nullbb
id1nullnull
id2aanull
id2nullbb
.........

Итоговый select должен содержать по одному уникальному идентификатору с параметрами, которые должны удовлетворять следующим условиям:
1. Если заполнены оба параметра, то выбирается par1 = aa, par2 = bb,
2. Если заполнен первый параметр, то выбирается par1= aa, par2 = null
3. Если заполнен второй параметр, то выбирается par1=null, par2 = bb
4. Если оба параметры не заполнены, то выбирается par1 = null, par2 = null.

В примере из таблицы, параметры для идентификатора id1 удовлетворяют первому условию, а параметры для идентификатора id2 второму.
Итог должен получиться таким:
id1,aa,bb
id2,aa,null

Заранее спасибо!
http://www.cyberforum.ru/sql-server/thread1376374.html
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
14.12.2016, 13:39
Я подобрал для вас темы с готовыми решениями и ответами на вопрос Нахождение уникальных значений из таблицы по нескольким условиям (SQL Server):

Количество по нескольким условиям в SQLite
SQlite Например так я могу вытащить кол-во записей по одному условию SELECT...

Суммирование по нескольким условиям в одном запросе
Доброго времени суток, форумчане! Есть такая таблица служебных командировок: ...

Join одной таблицы по нескольким полям другой таблицы
Здравствуйте! Интересует возможность следующего: Есть, например, такой...

MSSQL вставка уникальных значений
Добрый день, вопрос в следующем. есть в таблице три поля с ключами (...

Последовательный генератор уникальных значений
Есть таблицы с первичным ключом тип: int Добавляя новые данные пользователь...

6
YuryK
1029 / 846 / 337
Регистрация: 08.12.2016
Сообщений: 3,283
14.12.2016, 13:55 #2
T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
DECLARE @Res TABLE (Id int, par1 varchar(50), par2 varchar (50))
 
INSERT INTO @Res
SELECT * FROM TBL WHERE par1 IS NOT NULL AND par2  IS NOT NULL
 
INSERT INTO @Res
SELECT tbl.* FROM 
  TBL 
  LEFT JOIN @Res r ON tbl.Id = r.Id
WHERE tbl.par1 IS NOT NULL AND tbl.par2  IS NULL AND r.Id IS NULL
 
INSERT INTO @Res
SELECT tbl.* FROM 
  TBL 
  LEFT JOIN @Res r ON tbl.Id = r.Id
WHERE tbl.par1 IS NULL  AND tbl.par2  IS NOT NULL AND r.Id IS NULL
 
INSERT INTO @Res
SELECT tbl.* FROM 
  TBL 
  LEFT JOIN @Res r ON tbl.Id = r.Id
WHERE tbl.par1 IS NULL  AND tbl.par2  IS NULL AND r.Id IS NULL
 
SELECT * FROM @Res
0
invm
1817 / 1227 / 349
Регистрация: 02.06.2013
Сообщений: 3,077
14.12.2016, 14:09 #3
T-SQL
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
with a as
(
 select
  t.*, row_number() over (partition by t.ID order by p.n) as rn
 from
  Таблица t cross apply
  (
   select
    case
     when par1 = 'aa' and par2 = 'bb' then 1
     when par1 = 'aa' and par2 is null then 2
     when par1 is null and par2 = 'bb' then 3
     when par1 is null and par2 is null then 4
     else 5
    end
  ) p(n)
 where
  p.n < 5
)
select
 ID, par1, par2
from
 a
where
 rn = 1;
0
Temper_sgy
8 / 3 / 1
Регистрация: 18.06.2013
Сообщений: 17
14.12.2016, 15:06  [ТС] #4
YuryK, invm, Спасибо за предложенные методы.

Может быть есть какой-то способ обойтись без рекурсии?
0
invm
1817 / 1227 / 349
Регистрация: 02.06.2013
Сообщений: 3,077
14.12.2016, 15:12 #5
Temper_sgy, и где вы увидели рекурсию?
1
YuryK
1029 / 846 / 337
Регистрация: 08.12.2016
Сообщений: 3,283
14.12.2016, 15:16 #6
Цитата Сообщение от Temper_sgy Посмотреть сообщение
обойтись без рекурсии?
где ты здесь рекурсию нашел?

Я разбил на "атомарные" наглядные операцию по отбору записей из таблицы
сначала отобрал те, которые удовлетворяют условию 1)
затем добавил те, которые удовлетворяют условию 2)
...

Если ты хочешь в одном запросе, то см. решение от invm

Или чего-то другого хочется? Так хоть намекни, чего
1
Temper_sgy
8 / 3 / 1
Регистрация: 18.06.2013
Сообщений: 17
14.12.2016, 16:01  [ТС] #7
YuryK, invm, Вероятно, я неправильно выразился. С CTE не сталкивался в принципе, информация по первым ссылкам в гугле навела на мысль о рекурсии.
Тема поста связана с решением составной части задачи.
Изначально есть три таблицы с различными данными, в каждой имеется идентификатор ID. В двух таблицах содержатся дубли, которые чистятся с помощью предложенных Вами запросов.

Задача состоит в том, чтобы отразить статистику в одном запросе с помощью группировки параметров по объединенной таблице, которая содержит только уникальные записи ID.
0
14.12.2016, 16:01
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.12.2016, 16:01
Привет! Вот еще темы с решениями:

Запрос с выводом уникальных значений
Здравствуйте , мне нужно сделать запрос на вывод количество уникальных числовых...

Выборка финальных значений в промежутке и нахождение несуществующих значений
всем привет! прошу помощи начинающему, есть 3 таблицы: две из них - с данными...

Сортированный список уникальных имён по нескольким условиям с суммированием количества
Здравия! На складе куча хлама и периодически приходится распечатывать отчёт...

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


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru