组列在SQL Server中不完全匹配

时间:2019-10-17 15:27:50

标签: sql sql-server regex

我正在研究查询以提取商人列表并获取该商人的交易计数。这是一个示例(注意:我的表中有更多列用于描述,位置,状态,金额,日期等,但是这些是重要的列)。

TransactionID    MerchantName            

1                MERCHANTA #123          
2                MERCHANTA #541          
3                MERCHANTA #456          
4                MERCHANTB #123          
5                MERCHANTB          
6                SOME MERCHANTC #123     

现在,我想将这些商人分组在一起,但是由于每个商人可以拥有多个商店,因此他们的商人名称并不总是与其他交易相同。

我知道将它们组合在一起的唯一方法是以下标准查询,但是对于不同的商店编号永远都行不通。

SELECT MerchantName, COUNT(*)
FROM Transactions
GROUP BY MerchantName

我的目标是使用正则表达式用通配符或空白字符串替换商店编号,这样我就可以按商家将它们分组在一起,而与商店编号无关。这是我的模式:[#*]\s?[a-zA-Z\d]?

预期输出:

MerchantName        TransactionCount          

MERCHANTA           3
MERCHANTB           2
SOME MERCHANTC      1

这甚至可能吗?如果是这样,什么是这样做的好方法?预先感谢。

3 个答案:

答案 0 :(得分:3)

另一个选择。

不需要IIF()或CASE。我们只是在charindex()中添加了“故障保护”

示例

Declare @YourTable Table ([TransactionID] int,[MerchantName] varchar(50))
Insert Into @YourTable Values 
 (1,'MERCHANTA #123')
,(2,'MERCHANTA #541')
,(3,'MERCHANTA#456')     -- << made ugly
,(4,'   MERCHANTB #123') -- << made ugly
,(5,'MERCHANTB')
,(6,'SOME MERCHANTC #123')

Select [MerchantName]
      ,TransCount    = count(*)
 From ( 
        Select [MerchantName] = ltriM(rtrim(left([MerchantName],charindex('#',[MerchantName]+'#')-1)))
         From  @YourTable
      ) A 
 Group By [MerchantName]

返回

MerchantName    TransCount
MERCHANTA       3
MERCHANTB       2
SOME MERCHANTC  1

>编辑*

...
Select [MerchantName] = ltriM(rtrim(left([MerchantName],charindex('#',replace([MerchantName],'*','#')+'#')-1)))
 From  @YourTable
...

答案 1 :(得分:1)

考虑:

with cte as (
    select 
        TransactionID,
        iif(
            charindex(' #', MerchantName) > 0, 
            left(MerchantName, charindex(' #', MerchantName) - 1),
            MerchantName
        ) MerchantName
    from mytable
)
select MerchantName, count(*) TransactionCount
from cte
group by MerchantName

在公用表表达式中,我们通过删除' #'之后的所有内容(空格,然后是井号)来修改商家名称。然后剩下要做的就是聚合。

Demo on DB Fiddle

MerchantName   | TransactionCount
:------------- | ---------------:
MERCHANTA      |                3
MERCHANTB      |                2
SOME MERCHANTC |                1

请注意:这假设' #'始终代表拆分模式。

答案 2 :(得分:0)

使用材料 Patindex

DECLARE @MYTAB AS TABLE(transactionId int IDENTITY(1,1),MerchantName nvarchar(50))

    insert into @MYTAB(MerchantName) values('MERCHANTA #123')
    insert into @MYTAB(MerchantName) values('MERCHANTA #541')          
    insert into @MYTAB(MerchantName) values('MERCHANTA #456')          
    insert into @MYTAB(MerchantName) values('MERCHANTB #123')         
    insert into @MYTAB(MerchantName) values('MERCHANTB')         
    insert into @MYTAB(MerchantName) values('SOME MERCHANTC #123')

    ;with cte as(
    select 
    case
    when stuff(MerchantName,patindex('%#%',MerchantName),4,'') is not null then 
    stuff(MerchantName,patindex('%#%',MerchantName),4,'') else MerchantName end [customer] from @MYTAB )
    select [customer],count(1) transactionCount from cte group by [customer]

enter image description here