SQL 比较一列的行数据 Return 生活结果作为一行
SQL Comapare Row Data For One Column Return Like Results As One Row
我有一个简单的 table,其中包含以下列
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
table 基本上是安装在组织内各种计算机上的打印机的集合。由于同一台打印机可以安装在多台计算机上(想想网络打印机),table 充满了重复项。我们可以使用 PortName 来识别重复项,但是,某些行会显示 PortName 的轻微变化,例如10.0.0.200 和 10.0.0.200_1。
是否可以比较每行中的数据,只关注 PortName 列中的数据,以及数据是否相似,例如10.0.0.200 与 10.0.0.200_1 return 单行结果?
这里是 table
的例子
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
...理想情况下我会 return
冲电气 MC560(收银机) | OKI MC560 试用1 | 10.0.0.200
我不太在意 PrinterModel/Printer 名称是 return 的哪一行,只要我们最终只得到一个结果,它可以来自任何行。
我在此处查看了一个类似的问题 SQL compare data from two tables 但是我看不出他们是如何使用 difference 命令比较文本字符串的?
已附上当前查询的屏幕截图以及 returned 数据。任何建议将不胜感激。
SQL Query Screen Shot
尝试这样的事情:
Select max(PrinterModel), max(PrinterName), left(PortName,charindex("_",PortName+"_")-1)
from [ksubscribers].[dbo].[vCurrPrinterInfo]
where ......
group by left(PortName,charindex("_",PortName+"_")-1)
假设您不关心 PrinterModel 和 PrinterName 列中出现的可能值中的哪一个,这应该会为您提供所需的结果。
"left" 函数有效地去除了来自“_”等的部分。
添加 _ 将涵盖末尾没有 _ 的情况。
我有一个简单的 table,其中包含以下列
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
table 基本上是安装在组织内各种计算机上的打印机的集合。由于同一台打印机可以安装在多台计算机上(想想网络打印机),table 充满了重复项。我们可以使用 PortName 来识别重复项,但是,某些行会显示 PortName 的轻微变化,例如10.0.0.200 和 10.0.0.200_1。
是否可以比较每行中的数据,只关注 PortName 列中的数据,以及数据是否相似,例如10.0.0.200 与 10.0.0.200_1 return 单行结果?
这里是 table
的例子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
...理想情况下我会 return
冲电气 MC560(收银机) | OKI MC560 试用1 | 10.0.0.200
我不太在意 PrinterModel/Printer 名称是 return 的哪一行,只要我们最终只得到一个结果,它可以来自任何行。
我在此处查看了一个类似的问题 SQL compare data from two tables 但是我看不出他们是如何使用 difference 命令比较文本字符串的?
已附上当前查询的屏幕截图以及 returned 数据。任何建议将不胜感激。
SQL Query Screen Shot
尝试这样的事情:
Select max(PrinterModel), max(PrinterName), left(PortName,charindex("_",PortName+"_")-1)
from [ksubscribers].[dbo].[vCurrPrinterInfo]
where ......
group by left(PortName,charindex("_",PortName+"_")-1)
假设您不关心 PrinterModel 和 PrinterName 列中出现的可能值中的哪一个,这应该会为您提供所需的结果。
"left" 函数有效地去除了来自“_”等的部分。
添加 _ 将涵盖末尾没有 _ 的情况。