SQL Server - Группировка - дополнительная колонка

голоса
4

У меня есть проблема, которую я с трудом могу выразить словами, и, таким образом, был не в состоянии найти решение, прежде чем создавать этот пост. Пожалуйста, простите меня, если это было предложено ранее. Позвольте мне проиллюстрировать ввод и желаемый результат:

Order    Description    Operation    OperationDescription    SubTarget
12       Order12        Op1          Order12, Op1            ABA
12       Order12        Op2          Order12, Op2            ABB
18       Order18        Op1          Order18, Op1            XYA
18       Order18        Op2          Order18, Op2            XYB
19       Order19        Op1          Order19, Op1            KLA
20       Order20        Op1          Order20, Op1            Truck123
20       Order20        Op2          Order20, Op2            Truck456
20       Order20        Op3          Order20, Op3            Truck789
20       Order20        Op4          Order20, Op4            Truck123

Когда я запрашиваю вышеприведенную таблицу и группу приказа и описанием, я хотел бы получить весь полукокс из SubTarget (слева писать) до тех пор, как они совпадают (и отбросить остаток):

Order    Description    SubTarget
12       Order12        AB
18       Order18        XY
19       Order19        KLA
20       Order20        Truck

Однажды я нашел некоторые аккуратный код на сети конкатенировать различные значения из колонки не в группе по статье, используя STUFF и FOR XML PATH. Не уверен, что если такой подход может быть полезным здесь.

Спасибо всем заранее!

С уважением, Toby

Дополнительные замечания, основанные на комментарии и ответ от @junketsu:
Существует столбец Target в фоновом режиме, который не доступен. Ее содержание всегда разбиение SubTarget - наоборот: SubTarget далее добавляет некоторые детали к цели путем добавления дополнительных символов в конце строки. Тем не менее, оба значения не ограничиваются два или три символов соответственно. Если да, то я мог бы легко использовать функцию подстроки.

Thrid пример (Приказ № 19) , может привести к путанице. Я включил этот пример так показать , что это было бы хорошо для всей строки в результате если бы только одна единственная операция в порядке. Другим примером может быть: Заказ 5 с операцией Op1, OP2, op3 и SubTarget Truck123, Truck456, Truck789 и грузовик 123. Это должно произвести Truck в качестве результата. Повторение Truck123 ошибок нет. Надеюсь , что это делает его более четким.
В конце концов , я хочу подойти фактическое содержание столбца Target , поскольку он не может быть включен в запросе.

Еще раз спасибо, Toby

Задан 27/11/2018 в 15:12
источник пользователем
На других языках...                            


2 ответов

голоса
0

Я не могу в состоянии понять ваши дополнительные заметки и The thrid пример (Order # 19) . Я просто работал для вашего ожидаемого ответа,

create table #group (Orders int,Description varchar (20),Operation varchar (20)
                     ,OperationDescription varchar (20),SubTarget varchar (20)
                    )

insert into #group values
 (20,'Order20','Op1','Order20, Op1','Truck123')
,(20,'Order20','Op2','Order20, Op2','Truck456')
,(20,'Order20','Op3','Order20, Op3','Truck789')
,(20,'Order20','Op4','Order20, Op4','Truck123')
,(12,'Order12','Op1','Order12 Op1','ABA')
,(12,'Order12','Op2','Order12 Op2','ABB')
,(18,'Order18','Op1','Order18 Op1','XYA')
,(18,'Order18','Op2','Order18 Op2','XYB')
,(19,'Order19','Op1','Order19 Op1','KLA')

select distinct 
gor.Orders, gor.Description, iif (g.c = 1, gor.SubTarget 
, left (gor.subtarget, 2)) subtraget
from (
 select distinct
 orders, Description
 , count (*) c
 from #group group by orders, Description 
) g join #group gor on g.Orders = gor.Orders 

И я получил:

Orders      Description     subtraget
12          Order12         AB
18          Order18         XY
19          Order19         KLA
20          Order20         Tr

Откат меня, если запрос нуждается в обновлении.

Обновление 1 Найти обновленный запрос.

select distinct
orders, Description, Operation, OperationDescription
, iif (count (*) over (partition by orders, Description )  = 1, subtarget, 
       left (subtarget, 2)
  ) subtarget
from #group 

Обновление 2

1). КТР : Прежде всего я беру подстроку всех subtarget.

например: Truck123-> Truck12-> Truck1 -> ......-> Тр .

2). countlen : Я считаю картину в КТР и получить максимальную длину. Так, основная строка приходит много раз.

например: Грузовик приходит больше времени , чем, Trunck123, Trunck456, Trunck789, Trunck123 .

А грузовик длина больше , чем Tr, Tru, Truc .

3). MAXCOUNT : Я получаю максимальное количество, которые возвращенное countlen

4). Наконец я присоединиться к выше CTE без subtarget. Затем , который получил от КТР .

;with cte as ( 
 select Orders, Description, SubTarget, len (SubTarget) len  from #group  
 union all
 select Orders, Description, left (subtarget, len (SubTarget) - 1)
 , LEN (SubTarget) - 1  from cte  where len > 2
), countlen as (
select
 Orders, Description, SubTarget
 , count (len) over (partition by Orders, Description, SubTarget order by len) count 
 , max (len)  over (partition by Orders, Description, SubTarget order by len) maxlen
 from cte
), maxcount as (
 select Orders, Description, max (count) maxcount from countlen group by Orders, Description
) select distinct
o.Orders, o.Description, c.SubTarget 
from ( 
 select 
 cc.Orders, cc.Description, max (cc.maxlen) maxofmax
 from countlen cc
 join maxcount m
 on cc.Orders = m.Orders and cc.Description = m.Description 
 where m.maxcount = cc.count
 group by cc.Orders, cc.Description 
) o 
join cte c
on o.Orders = c.Orders and o.Description = c.Description and len (c.SubTarget) = o.maxofmax
Ответил 28/11/2018 в 11:07
источник пользователем

голоса
0

Здесь вы идете сударь

create table #temp_1
( [order] int null
,Description varchar(15) null
,Operation varchar(30) null
,OperationDescription varchar(30) null
,SubTarget varchar(30) null
)



insert into #temp_1 values

(12       ,'Order12','Op1',          'Order12, Op1'            ,'ABA')
,(12       ,'Order12',' Op2',           'Order12, Op2'            ,'ABB')
,(18       ,'Order18','Op1',           'Order18, Op1'            ,'XYA')
,(18       ,'Order18','Op2',           'Order18, Op2'           ,'XYB')
,(19       ,'Order19','Op1',           'Order19, Op1'           ,'KLA')


select *
from (
select *

,Rank_1 = Row_number() over(partition by SubTarget_1 order by [Order] asc)
from (
select [order],[Description]
--,SubTarget = substring(SubTarget,0,3)
,SubTarget_1 = case when SubTarget like 'a%b%' then 'AB'
when SubTarget like 'x%y%'then 'XY' else SubTarget end
from #temp_1
) a
) b
where Rank_1 = 1
order by [Order] asc
Ответил 27/11/2018 в 18:15
источник пользователем

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more