Je dois diviser les colonnes en différentes colonnes. Exemple de données de table
Table: Légumes
select t1.in_kgs as 'Veg1', t2.in_kgs as 'Veg2', t3.in_kgs as 'Veg3' from (select vname,in_kgs from vegetables where vname='Veg1')t1 left join (select vname,in_kgs from vegetables where vname='Veg2')t2 on t1.Vname=t2.vname left join (select vname,in_kgs from vegetables where vname='Veg3')t3 on t1.Vname=t3.vname
Je veux que ma sortie soit:
------------------------ Veg1 | Veg2 | Veg3 | ------------------------ 1.5 | 11.2 | 1.5 | 2.5 | 13 | 1.2 | 1.1 | 12 | 1.9 | 2.5 | 14 | 1.1 | ------------------------
Requête que j'ai préparée , mais ma sortie en obtenant des valeurs tous les doublons
---------------------- Vname | in kgs | ---------------------- Veg1 | 1.5 | Veg1 | 2.5 | veg1 | 1.1 | veg1 | 2.5 | veg2 | 11.2 | veg2 | 13 | veg2 | 12 | veg2 | 14 | veg3 | 1.5 | veg3 | 1.2 | veg3 | 1.9 | veg3 | 1.1 | ---------------------
3 Réponses :
Essayez ceci ci-dessous script-
SELECT A.[in kgs] AS Veg1, B.[in kgs] AS Veg2, C.[in kgs] AS Veg3 FROM ( SELECT Vname,[in kgs], ROW_NUMBER() OVER(ORDER BY Vname) RN FROM Vegetables WHERE Vname = 'Veg1' )A FULL JOIN ( SELECT Vname,[in kgs], ROW_NUMBER() OVER(ORDER BY Vname) RN FROM Vegetables WHERE Vname = 'Veg2' )B ON A.RN = B.RN FULL JOIN ( SELECT Vname,[in kgs], ROW_NUMBER() OVER(ORDER BY Vname) RN FROM Vegetables WHERE Vname = 'Veg3' )C ON B.RN = C.RN
Vous pouvez utiliser row_number ()
pour générer un numéro de séquence par Vname
. Et puis utilisez la casse conditionnelle pour le regrouper en 3 colonnes diff
select * from ( select *, r = row_number() over (partition by Vname order by Winkgs) from Vegetables ) v pivot ( max(Winkgs) for Vname in ([Veg1], [Veg2], [Veg3]) ) p
Ou si vous préférez utiliser l'opérateur PIVOT
select max(case when Vname = 'Veg1' then Winkgs end) as Veg1, max(case when Vname = 'Veg2' then Winkgs end) as Veg2, max(case when Vname = 'Veg3' then Winkgs end) as Veg3 from ( select *, r = row_number() over (partition by Vname order by Winkgs) from Vegetables ) v group by r
Une option consisterait à déterminer les valeurs d'identifiant de 1 à 4 pour chaque légume, puis à appliquer les instructions case..when
:
with v2 as ( select v.*, row_number() over (partition by [Vname] order by [Vname]) as id from Vegetables v ) select max( case when [Vname] = 'veg1' then [in kgs] end ) as "veg 1", max( case when [Vname] = 'veg2' then [in kgs] end ) as "veg 2", max( case when [Vname] = 'veg3' then [in kgs] end ) as "veg 3" from v2 group by id;
Démo
Existe-t-il une colonne disponible à travers laquelle les données peuvent être commandées pour veg1, veg2 et veg3? ou toute commande est acceptable?
aucune commande juste des données suffit
Et si les données de la commande de la colonne 3 changeaient par rapport à votre sortie attendue donnée?
oui cela pourrait être, c'est peut-être le problème qui me fait obtenir des enregistrements en double. Peut être