2017-02-15 60 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 

表基本上是安装在一个组织内的各种电脑打印机的集合。由于可以在多台计算机上安装同一台打印机(请考虑网络打印机),表格中充满了重复项目。我们可以使用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

+0

您可以使用'GROUP BY PortName'。如果您使用分组,则选择区域中的其他行必须汇总为'MAX(PrinterModel),MAX(PrinterName)'。如果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确实。尽管图片中的图片实际上不再更长。 :) – theblitz

+0

纠正他们是各种奇怪和美妙的端口名称。这里有一些例子 – Chiper

相关问题