Petite question, pas si familière avec le serveur SQL, mais j'ai une requête avec plusieurs agrégats dans le serveur Oracle SQL.

Qu'est-ce qu'une requête équivalente au serveur SQL pour plusieurs agrégats ?

Code Oracle :

[SELECT *
   FROM (SELECT d.loc_area,
                d.loc_rack,
                d.loc_height,
                d.loc_place,
                d.locvrc,
                row_number() OVER(PARTITION BY d.loc_area, d.loc_rack, d.loc_place
                                   ORDER BY d.loc_height) rn_pivot
           FROM (select locvrc,
                        SUBSTR(stoloc, 0, 2) loc_area,
                        SUBSTR(stoloc, 4, 2) loc_rack,
                        SUBSTR(stoloc, 6, 1) loc_place,
                        SUBSTR(stoloc, -2) loc_height
                   FROM locls) d)
  PIVOT (MAX(loc_height) AS EXT, MIN(locvrc) AS UNIQ FOR rn_pivot IN ('1' AS HEIGHT_1, '2' AS HEIGHT_2, '3' AS HEIGHT_3, '4' AS HEIGHT_4))
  ORDER BY LOC_AREA,
        LOC_RACK,
        LOC_PLACE]

Serveur SQL:

SELECT *
   FROM (SELECT d.loc_area,
                d.loc_rack,
                d.loc_height,
                d.loc_place,
                d.locvrc,
                row_number() OVER(PARTITION BY d.loc_area, d.loc_rack, d.loc_place
                                   ORDER BY d.loc_height) rn_pivot
           FROM (select locvrc,
                        SUBSTRing(stoloc, 0, 2) loc_area,
                        SUBSTRing(stoloc, 4, 2) loc_rack,
                        SUBSTRing(stoloc, 6, 1) loc_place,
                        right(stoloc, 2) loc_height
                   FROM locls) d) A
  PIVOT (MAX(loc_height) FOR rn_pivot IN ([1],[2],[3],[4])) P1 

Cela fonctionne bien, mais j'ai besoin de l'autre agrégat |(MIN(locvrc)| également

Merci d'avance!

Br Jan

/Éditer,

Tableau d'origine:

 Stoloc          locvrc
 5D-32A-00       699787
 5D-32A-10       439567
 5D-32A-20       429456
 5D-32A-30       122172
 5D-32B-00       328311
 5D-32B-10       247422
 5D-32B-20       133244
 5D-32B-30       464978

Tableau après sous-chaîne :

loc_area loc_rack loc_place loc_height locvrc
 5D         32       A        00       699787
 5D         32       A        10       439567
 5D         32       A        20       429456
 5D         32       A        30       122172
 5D         32       B        00       328311
 5D         32       B        10       247422
 5D         32       B        20       133244
 5D         32       B        30       464978

Ce que j'ai avec Oracle, c'est ça :

loc_area loc_rack loc_place Height1 Uniq1   Height2 Uniq2   Height3 Uniq3 Height4 Unique4
5D       32        A         00     699787    10    439567    20    429456    30   122172
5D       32        B         00     328311    10    247422    20    133244    30   464978

Ainsi, à partir de la table d'origine, le stoloc sera découpé en différentes colonnes. Après cela, dans une ligne serait zone, rack, place et avec eux dans une rangée Hauteur et locvrc. J'ai terminé cela dans la base de données Oracle, mais je ne sais pas comment le faire sur le serveur SQL. N'a pas besoin d'être ce genre de solution, tout fera l'affaire.

2
Jan00 16 oct. 2020 à 13:29

1 réponse

Meilleure réponse

Vous pourriez trouver cela étrange, mais à ma connaissance, c'est ainsi que nous pouvons le faire dans SQL server.

Nous devons créer une autre dimension pour les mêmes colonnes pivot en y ajoutant n'importe quoi et en la mettant dans la clause PIVOT.

Comme vous le voyez, j'ai ajouté 1 et créé une autre colonne à utiliser pour locvrc

SELECT *
   FROM (SELECT d.loc_area,
                d.loc_rack,
                d.loc_height,
                d.loc_place,
                d.locvrc,
                row_number() OVER(PARTITION BY d.loc_area, d.loc_rack, d.loc_place
                                   ORDER BY d.loc_height) rn_pivot,
                cast(row_number() OVER(PARTITION BY d.loc_area, d.loc_rack, d.loc_place
                                   ORDER BY d.loc_height) as varchar) + '1' rn_pivot_locvrc
           FROM (select locvrc,
                        SUBSTRing(stoloc, 0, 2) loc_area,
                        SUBSTRing(stoloc, 4, 2) loc_rack,
                        SUBSTRing(stoloc, 6, 1) loc_place,
                        right(stoloc, 2) loc_height
                   FROM locls) d) A
  PIVOT (MAX(loc_height) FOR rn_pivot IN ([1],[2],[3],[4])) P1
  PIVOT (MAX(locvrc) FOR rn_pivot_locvrc IN ([11],[21],[31],[41])) P2

P.S. Mon intention est de dire comment vous pouvez PIVOT plusieurs colonnes mais malheureusement, je ne peux certainement pas valider le jeu de résultats.

EDIT : requête mise à jour avec les données réelles de l'Op

SELECT loc_area,loc_rack,loc_place
      ,max([1]) as height_1
      ,max([11]) as unique_1
      ,max([2]) as height_2
      ,max([21]) as unique_2
      ,max([3]) as height_3
      ,max([31]) as unique_3
      ,max([4]) as height_4
      ,max([41]) as unique_4
   FROM (SELECT d.loc_area,
                d.loc_rack,
                d.loc_height,
                d.loc_place,
                d.locvrc,
                row_number() OVER(PARTITION BY d.loc_area, d.loc_rack, d.loc_place
                                   ORDER BY d.loc_height) rn_pivot,
                cast(row_number() OVER(PARTITION BY d.loc_area, d.loc_rack, d.loc_place
                                   ORDER BY d.loc_height) as varchar) + '1' rn_pivot_locvrc
           FROM (select locvrc,
                        SUBSTRing(stoloc, 0, 2) loc_area,
                        SUBSTRing(stoloc, 4, 2) loc_rack,
                        SUBSTRing(stoloc, 6, 1) loc_place,
                        right(stoloc, 2) loc_height
                   FROM locls) d) A
  PIVOT (MAX(loc_height) FOR rn_pivot IN ([1],[2],[3],[4])) P1
  PIVOT (MAX(locvrc) FOR rn_pivot_locvrc IN ([11],[21],[31],[41])) P2
group by loc_area,loc_rack,loc_place

OU

En utilisant aggregation et case, cela peut également être fait,

SELECT loc_area,loc_rack,loc_place
      ,max(case when rn = 1 then loc_height end) height_1
      ,max(case when rn = 1 then locvrc end) unique_1
      ,max(case when rn = 2 then loc_height end) height_2
      ,max(case when rn = 2 then locvrc end) unique_2
      ,max(case when rn = 3 then loc_height end) height_3
      ,max(case when rn = 3 then locvrc end) unique_3
      ,max(case when rn = 4 then loc_height end) height_4
      ,max(case when rn = 4 then locvrc end) unique_4
   FROM (SELECT d.loc_area,
                d.loc_rack,
                d.loc_height,
                d.loc_place,
                d.locvrc,
                row_number() OVER(PARTITION BY d.loc_area, d.loc_rack, d.loc_place
                                   ORDER BY d.loc_height) rn
           FROM (select locvrc,
                        SUBSTRing(stoloc, 0, 2) loc_area,
                        SUBSTRing(stoloc, 4, 2) loc_rack,
                        SUBSTRing(stoloc, 6, 1) loc_place,
                        right(stoloc, 2) loc_height
                   FROM locls) d) A
group by loc_area,loc_rack,loc_place;
2
Sujitmohanty30 16 oct. 2020 à 12:18