SQL Server - Groupe par - colonne supplémentaire

voix
4

J'ai un problème que je peux à peine mettre en mots et n'a donc pas été en mesure de rechercher une solution avant de créer ce poste. S'il vous plaît pardonnez-moi si cela a été demandé avant. Permettez-moi d'illustrer l'entrée et la sortie souhaitée:

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

Lorsque je fais une recherche du tableau ci-dessus et le groupe par ordre et description, je voudrais obtenir tous omble chevalier de sous-objectif (de gauche à écrire) tant qu'ils correspondent (et jeter le reste):

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

Une fois, je trouve un code propre sur le net pour concaténer les différentes valeurs d'une colonne pas dans le groupe par clause, en utilisant STUFF et FOR XML PATH. Je ne sais pas si cette approche pourrait être utile ici.

Merci d'avance à tous!

Cordialement, Toby

Notes complémentaires, en fonction des commentaires et des réponses de @junketsu:
Il y a une cible de colonne en arrière - plan, ce qui est pas accessible. Son contenu est toujours une partition de sous - objectif - l'inverse: ajoute encore sous - objectif quelques détails à la cible en ajoutant plus de caractères à la fin de la chaîne. Cela dit, les deux valeurs ne sont pas limitées à deux ou trois caractères respectivement. Si oui, je pourrais facilement utiliser la fonction sous - chaîne.

L'exemple thrid (ordonnance n 19) peut être source de confusion. J'inclus cet échantillon afin montrent qu'il serait bien à l'ensemble de la chaîne à la suite s'il n'y avait qu'une seule opération dans l'ordre. Un autre exemple peut être: ordre 5 avec l' opération OP1, OP2, OP3 et Truck123 sous - objectif, Truck456, Truck789 et camions 123. Cela devrait produire Truck comme résultat. La répétition de Truck123 a pas d' erreur. Espérons que cela le rend plus clair.
En fin de compte, je veux aborder le contenu réel de la cible de la colonne car il ne peut pas être inclus dans la requête.

Merci encore, Toby

Créé 27/11/2018 à 15:12
source utilisateur
Dans d'autres langues...                            


2 réponses

voix
0

Je ne peux pas en mesure de comprendre vos notes complémentaires et l'exemple thrid (ordonnance N ° 19) . Je viens travaillé pour votre réponse attendue,

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 

Et je suis arrivé:

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

Rétablissez-moi, si la requête des mises à jour a besoin.

Mise à jour 1 Trouver la requête mise à jour.

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

Mise à jour 2

1). cte : Tout d' abord je prends une sous-chaîne de tous les sous - objectif.

par exemple: Truck123-> Truck12-> Truck1 -> ......-> Tr .

2). countlen : Je compte le modèle en cte et obtenir la longueur max. Parce que, chaîne de base est à plusieurs reprises.

par exemple: camion vient plus de temps que, Trunck123, Trunck456, Trunck789, Trunck123 .

Et Truck longueur est supérieure à Tr, Tru, Truc .

3). maxcount : Je reçois le nombre maximum, qui sont retournés par countlen

4). Enfin , je me joins au- dessus des années cte sans sous - objectif. Ensuite , ce qui est obtenu à partir cte .

;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
Créé 28/11/2018 à 11:07
source utilisateur

voix
0

Ici, vous allez bon monsieur

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
Créé 27/11/2018 à 18:15
source utilisateur

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