Групповые столбцы, которые не совсем совпадают в SQL Server - PullRequest
0 голосов
/ 17 октября 2019

Я работаю над запросом, чтобы получить список продавцов и получить количество транзакций для этого продавца. Вот пример (Примечание: в моей таблице есть больше столбцов для описания, местоположения, статуса, суммы, даты и т. Д., Но это важные).

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

Моя цель - использовать Regex для заменыномер магазина с подстановочным знаком или пустой строкой, чтобы я мог сгруппировать их по продавцу, независимо от номеров магазина. Вот мой шаблон: [#*]\s?[a-zA-Z\d]?

Ожидаемый результат:

MerchantName        TransactionCount          

MERCHANTA           3
MERCHANTB           2
SOME MERCHANTC      1

Возможно ли это вообще? Если так, каков хороший способ сделать это? Заранее спасибо.

Ответы [ 3 ]

3 голосов
/ 17 октября 2019

Просто еще один вариант.

Нет необходимости в IIF () или CASE. Мы просто добавляем «fail-safe» в 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 голос
/ 17 октября 2019

Рассмотрим:

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

В обычном табличном выражении мы изменяем имя продавца, удаляя все, что идет после ' #' (пробел, затем знак хеша). Тогда все, что осталось сделать, это агрегировать.

Демонстрация на DB Fiddle :

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

Примечание: предполагается, что ' #'всегда представляет образец расщепления.

0 голосов
/ 17 октября 2019

Используя материал и 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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...