JKwaaan Ответов: 2

Как я могу получить как непустые, так и не повторяющиеся данные в SQL?


У меня есть данные, которые дублируются, и столбец, который иногда равен нулю (в зависимости от того, какой это продукт).

Примечание: все данные взяты из 1 таблицы.

Пример:

ID         |Generic Name|Description
0001        Cetirizine   Allerzet 10mg
0002        Cetirizine   Alnix 10mg
0003                     Disposable tube
0004        Paracetamol  Biogesic Tablet


Мой план состоит в том, чтобы извлечь общее имя в поле со списком без дубликатов.

Что я уже пробовал:

До сих пор у меня есть этот код для устранения нулевых данных. У меня возникли проблемы с попыткой извлечь только 1 общее имя из дубликатов.

Код:

select Item_GenName from ItemMasterlistTable where nullif(convert(varchar,Item_GenName),'') is not null"

2 Ответов

Рейтинг:
2

OriginalGriff

Проблема в том, что когда у вас есть кратные числа, вы должны решить для SQL, какую строку возвращать - он не знает, хотите ли вы, чтобы "Цетиризин" был "Аллерзет 10 мг" или "Алникс 10 мг", и он ненавидит выбрасывать информацию.
Вы можете выбрать первый или последний вариант:

SELECT MIN(ID) FROM ItemMasterlistTable GROUP BY [Generic Name] HAVING [Generic Name] IS NOT NULL

SELECT MAX(ID) FROM ItemMasterlistTable GROUP BY [Generic Name] HAVING [Generic Name] IS NOT NULL

А затем используйте JOIN для получения нужной информации:
SELECT g.ID, i.[Generic Name], i.Description 
FROM (SELECT MIN(ID) as ID 
      FROM ItemMasterlistTable 
      GROUP BY [Generic Name] 
      HAVING [Generic Name] IS NOT NULL) g
JOIN ItemMasterlistTable i 
     ON g.ID = i.ID


JKwaaan

Я обновил свой sql-запрос. Я не знаю, повлияет ли это на что-нибудь.

Без использования JOIN я все еще могу это сделать? Приведенные выше данные взяты только из 1 таблицы. Почти все образцы, которые я вижу, когда ищу помощь, предлагают присоединиться.

OriginalGriff

Это потому, что соединение-это правильный способ сделать это: SQL понимает соединения и может делать их очень, очень эффективно. Альтернативой является создание и заполнение временной таблицы и ее использование, но это действительно неприятно в лучшие времена.
Поскольку вам нужно GROUP BY, чтобы "собрать" строки в "пучки", а GROUP BY может работать только с агрегированными данными (SQL не любит принимать решения о том, какую строку использовать для вас, помните), вам нужно использовать подзапрос GROUP BY, чтобы выбрать уникальные идентификаторы строк, которые вы хотите использовать, а затем объединить эти данные обратно в исходную таблицу, чтобы получить фактические данные строки. С ним довольно просто работать, как только вы придете в себя!

0x01AA

Чего мне не хватает? Разве это не просто решить с помощью SELECT DISTINCT [Generic Name] FROM ItemMasterlistTable WHERE NOT [Generic Name] IS NULL?

Рейтинг:
1

kirthiga S

select [Generic Name] from Table where isnull([Generic Name],'')<>'' group by [Generic Name]


CHill60

Все, что вы сделали, это скопировали код из чужого комментария, настроили обработку null, предположив, что blank не требуется, а затем добавили совершенно ненужную "группу по"