SQL Comapare一列的行数据返回结果为一行

时间:2017-02-15 06:38:16

标签: sql sql-server comparison string-comparison difference

我有一个包含以下列的简单表

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

该表基本上是安装在组织内各种计算机上的打印机的集合。由于同一台打印机可以安装在多台计算机上(想想网络打印机),因此表格中包含重复数据。我们可以使用PortName来识别重复项,但是,有些行会在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

1 个答案:

答案 0 :(得分: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列中出现哪一个可能的值,那么这应该会给你所需的结果。

"左"功能有效地剥离了来自" _"等等。

添加_将涵盖最后没有_的情况。