2017-02-15 7 views
0

У меня есть простая таблица со следующими столбцамиSQL Comapare Ряд данные для одного столбца результатов Возвращения вроде как одна строки

PrinterModel: Модель принтера.

PrinterName: Название принтера, которое отображается на компьютере пользователя.

PortName: Обычно IP, UNC-путь или USB.

MachName: Компьютер, на котором был найден принтер.

Я создал следующий запрос

SELECT PrinterModel, PrinterName, PortName 
FROM [ksubscribers].[dbo].[vCurrPrinterInfo] 
WHERE PrinterModel NOT LIKE '%Microsoft%' 
     AND PrinterModel NOT LIKE '%PDF%' 
     AND PrinterModel NOT LIKE '%HP ePrint%' 
     AND PrinterModel NOT LIKE '%Snagit%' 
     AND PrinterModel NOT LIKE '%Nuance%' 
     AND PrinterModel NOT LIKE '%Amyuni%' 
     AND PrinterModel NOT LIKE '%Foxit%' 
     AND PrinterModel NOT LIKE '%Brother PC-FAX%' 
     AND PrinterModel NOT LIKE '%Remote Desktop%' 
     AND PrinterModel NOT LIKE '%Wondershare%' 
ORDER BY PortName 

таблица является в основном коллекция принтеров, установленных на различных компьютерах в организации. Поскольку один и тот же принтер может быть установлен на нескольких компьютерах (думаю, сетевой принтер), таблица полна дубликатов. Мы можем использовать имя порта для идентификации дубликатов, однако некоторые строки покажут небольшое изменение в имени порта, например. 10.0.0.200 и 10.0.0.200_1.

Можно ли сравнивать данные в каждой строке, фокусируясь только на данных в столбце PortName, и если данные аналогичны, например. 10.0.0.200 vs 10.0.0.200_1 возвращает результат одной строки?

Ниже приведен пример таблицы

Model   |  Name   | Port 

OKI MC560 (POS) | OKI MC560 Try 1 | 10.0.0.200 

OKI MC560 (PCL) | OKI MC560 Try 2 | 10.0.0.200 

OKI MC560 (PCL) | OKI MC560 Try 3 | 10.0.0.200_1 

OKI MC560 (TST) | OKI MC560 Try 1 | 10.0.0.200 

... и в идеале я хотел бы вернуться

OKI MC560 (POS) | OKI MC560 Попробуйте 1 | 10.0.0.200

Я не слишком суетился, какие строки PrinterModel/Printer Name возвращаются, пока мы заканчиваем только одним результатом, это может быть из любой строки.

Я рассмотрел аналогичный вопрос здесь SQL compare data from two tables Однако я не вижу, как они сравнивают текстовую строку с помощью команды разницы?

Приложите снимок экрана текущего запроса вместе с возвращаемыми данными. Любые рекомендации будут очень признательны.

SQL Query Screen Shot

+0

Вы можете использовать 'GROUP BY PortName'. Если вы используете группировку, другие строки в области «Выбрать» должны быть агрегированы как «MAX (PrinterModel), MAX (имя_сервера)». Если PortName отличается от вашего примера, вы должны сделать PortName уникальным. Например, удалите '_1' –

ответ

0

Попробуйте что-то вроде этого:

Select max(PrinterModel), max(PrinterName), left(PortName,charindex("_",PortName+"_")-1) 
from [ksubscribers].[dbo].[vCurrPrinterInfo] 
where ...... 
group by left(PortName,charindex("_",PortName+"_")-1) 

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

Функция «влево» эффективно отделяет части от «_» и «включено».

Добавление _ будет охватывать случаи, когда в конце нет _.

+1

Возможно, есть другие имена портов, длина которых превышает 10 символов. Как на картинке, которую он предоставил. –

+0

@SebastianSchulz True.Хотя те, что на картинке, на самом деле короче не дольше. :) – theblitz

+0

Исправить их все виды странных и замечательных имен портов. Вот несколько примеров: – Chiper

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