我正在研究查询以提取商人列表并获取该商人的交易计数。这是一个示例(注意:我的表中有更多列用于描述,位置,状态,金额,日期等,但是这些是重要的列)。
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
这甚至可能吗?如果是这样,什么是这样做的好方法?预先感谢。
答案 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
在公用表表达式中,我们通过删除' #'
之后的所有内容(空格,然后是井号)来修改商家名称。然后剩下要做的就是聚合。
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]