1
votes

Comment diviser la colonne du tableau en différentes colonnes à l'aide de Pivot ou de toute autre manière

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   |
--------------------- 


4 commentaires

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


3 Réponses :


2
votes

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


0 commentaires

2
votes

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


0 commentaires

2
votes

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


0 commentaires