Je parcours souvent les forums « IBM i » aussi bien francophones qu’anglophones, et l’on y trouve quelquefois quelques subtilités dont je vais vous en faire profiter.
Trucs et Astuces SQL
– CLAUSE ORDER BY STATIQUE
– Pivot SQL (V5R4)
– ROLLUP, CUBE et GROUPING SETS (V6R1)
– Les nouvelles vues SYS___STAT (V5R4 & V6R1)
Vous faites sans aucun doute du SQL dans vos programmes. On vous a toujours conseillé de faire du SQL Statique versus Dynamique pour une question de performances. Il est difficile de se passer du Dynamique pour fabriquer notre clause WHERE à la volée et généralement de même pour la clause ORDER BY. Bob COSY nous propose de conditionner la clause ORDER BY et ainsi conserver notre requête en Statique. Voir figure 1
Un internaute demande s’il est possible dans DB2 à partir de la table ci-dessous, de faire une requête afin d’obtenir plusieurs lignes dans une même colonne, c’est-à-dire un pivot. Voir figure 2.
Les Common Table [removed]V5R3), les fonctions OLAP (V5R4) ainsi que la récursivité (V5R4) toutes trois combinées nous permettent de résoudre la requête.
Commençons pas à pas, je demande d’abord un niveau de classement sur FRUIT avec une rupture par NAME en faisant appel à la fonction OLAP Row_Number() . Voir figure 3.
Puis je rajoute de la récursivité en prenant au départ les lignes de niveau 1 et en y ajoutant le niveau supérieur tout en concaténant les libellés. Voir figure 4.
Les deux premières lignes résultantes proviennent de la requête avec la clause « Where Niv = 1 », les autres sont issues de la récursivité.
Seulement voilà, du résultat précédent, seuls les niveaux les plus hauts m’intéressent pour chaque rupture de la colonne NAME. Voir figure 5.
Je finalise ma requête en récupérant le MAX() du niveau de chacun et en jointant le résultat pour obtenir mon libellé. (nb : un max() de libelle aurait aussi marché).
Une autre solution aurait été la création d’une UDF.
La V6R1 nous enrichit de quelques fonctions OLAP supplémentaires très intéressantes. Nous utilisons souvent les fonctions d’agrégation comme SUM, COUNT, MIN/MAX, AVG etc…afin d’extraire des totaux de nos données. Mais quid des sous-totaux ? Ces fonctions permettent justement de calculer des sous-totaux de lignes agrégées avec la clause GROUP BY.
ROLLUP
ROLLUP permet de calculer les sous-totaux et totaux pour les colonnes que vous lui présentez selon la hiérarchie que vous lui demandez. Voir figure 6.
Les lignes marquées d’un représentent les sous-totaux et totaux automatiquement ajoutés par ROLLUP par rapport à un simple GROUP BY, soit un total des effectifs par service et sexe quel que soit le job, un total par service et un total général.
Pour résumer un GROUP BY ROLLUP(A, B, C) calcule les totaux suivants :(A, B , C) > Idem GROUP BY
(A, B, null)
(A, null, null)
(null, null, null) > Total Général
CUBE
CUBE va encore plus loin que ROLLUP, car il fonctionne d’une façon multidimensionnelle et renvoie toutes les combinaisons possibles de sous-totaux. Voir figure 7.
Les lignes présentées ici sont ajoutées au résultat du ROLLUP, on peut y voir le total des jobs quels que soient le sexe et/ou le département, le nombre de femmes ou d’hommes de l’entreprise etc… en résumé tous les totaux et sous-totaux croisés.
(A, B , C)
(A, B, null)
(A, null, null)
(null, null, null)
(null, B, C)
(null, B, null)
(A, null, C)
(null, null, C)
GROUPING SETS
Si l’on veut soi-même choisir les sous-totaux sur les agrégats plutôt que d’obtenir tous les sous-totaux croisés comme peut l’offrir le puissant CUBE, dans ce cas il vous faudra utiliser la fonction OLAP Grouping Sets. Voir figure 8.
Attention, remarquez bien, que nous avons obtenu que les sous-totaux demandés et pas les lignes provenant d’un GROUP BY classique.
Pour ce faire il aurait fallu avoir la clause :
GROUPING SETS (
(DEPTNAME, SEX, JOB),
(DEPTNAME, SEX),
(SEX, JOB) )
On peut combiner l’ensemble de ces fonctions OLAP à la suite, du genre :
GROUP BY GROUPING SETS ((A, B), B), CUBE (C, D), ROLLUP (E, A)
Ce n’est pas interdit, mais cela peut pénaliser vos performances.
Le HAVING fonctionne de la même manière et s’applique à l’ensemble de ces fonctions.
Nouvelle fonction de colonne GROUPING()
Que vous utilisiez l’agrégat GROUP BY, ou l’une de ces trois nouvelles fonctions OLAP, vous pouvez tester si un champ possède la valeur Null (ce qui impliquerait un sous-total ou total) avec la fonction de colonne GROUPING(Nom du Champ). Exemple :
Select A, B, Count(*) as Nb, Grouping(A)
FROM MaTable Group BY CUBE(A, B)
La fonction renverra la valeur 1 si le champ A est Null, ou 0 dans le cas contraire.
Select A, B, Count(*) as Nb, Grouping(A) + Grouping(B) as Niv
FROM MaTable Group BY CUBE(A, B)
Dans l’exemple ci-dessus, si :
– Niv = 0 > il s’agit d’une ligne détail
– Niv = 1 > il s’agit d’un sous-total
– Niv = 2 > il s’agit du total général
Le catalogue base de données « IBM i » c’est-à-dire les différentes références croisées de DB2 (QSYS2/SYS*), est enrichi à chaque nouvelle version. La V6R1 n’est pas en reste avec la livraison de vues SQL statistiques très riches en information dont certaines sont d’ores et déjà disponibles en V5R4 par PTF. Elles vous permettront d’obtenir des statistiques sur vos tables (fichiers) et leur contenu, index (logiques) ainsi que sur vos partitions (membres).
Nom Long | Nom Court | Version | Type de Statistiques |
SYSCOLUMNSTAT | SYSCSTAT | V5R4 | Sur les champs |
SYSINDEXSTAT | SYSIXSTAT | V5R4 | Sur les Index SQL uniquement |
SYSTABLEINDEXSTAT | SYSTISTAT | V5R4 | Sur les tables + Contraintes de clés + tables |
SYSTABLESTAT | SYSTSTAT | V5R4 | Sur les tables |
SYSPACKAGESTAT | SYSPKSTAT | V6R1 | Sur les *SQLPKG |
SYSPROGRAMSTAT | SYSPGSTAT | V6R1 | Sur les programmes contenant du SQL |
SYSMQTSTAT | SYSMQTSTAT | V6R1 | Sur les tables matérialisées |
SYSPARTITIONSTAT | SYSPSTAT | V5R4 | strong>Même notion que les |
SYSPARTITIONINDEXSTAT | SYSPISTAT | V5R4 | strong> précédentes mais cette fois-ci avec la notion de |
SYSPARTITIONINDEXES | SYSPINDEX | V6R1 | strong>partitions, c’est-à-dire de |
SYSPARTITIONMQTS | SYSPMQT | V6R1 | strong>membres. |
SYSSCHEMAS | SYSSCHEMAS | V6R1 | Liste toutes les bibliothèques du système |
Téléchargez cette ressource
Comment lutter contre le Phishing ?
Dans un environnement cyber en constante mutation, le phishing évolue vers des attaques toujours plus sophistiquées combinant IA, automatisation et industrialisation. Une réalité complexe qui exige des mesures de sécurité avancées et repensées au-delà de l’authentification multifacteur. Découvrez les réponses technologiques préconisées par les experts Eviden et les perspectives associées à leur mise en œuvre.
Les articles les plus consultés
- L’utilisation des données pour survivre !
- Intelligence Artificielle : DeepKube sécurise en profondeur les données des entreprises
- Stockage autonome, Evolutivité & Gestion intelligente, Pure Storage offre de nouvelles perspectives aux entreprises
- La blockchain en pratique
- Dark Web : où sont vos données dérobées ?