Sélectionner des colonnes existantes et faire apparaître des colonnes créées et/ou calculées

Nous allons travailler sur la base de cette table « employes » faisant partie d’une base de données « usine » :

mysql> SELECT * FROM employes;
+---------+------------+----------+-------------------------+------------------+-------------+-------------+---------+------------+--------+
| emp_num | nom        | prenom   | metier                  | referent_manager | departement | date_entree | salaire | commission | indice |
+---------+------------+----------+-------------------------+------------------+-------------+-------------+---------+------------+--------+
|       1 | Scholer    | Georges  | directeur général       |             NULL |          20 | 2002-12-06  |    7500 |       1950 |   NULL |
|       2 | Henry      | Thierry  | manager recherche       |                1 |          30 | 2002-12-09  |    3475 |        450 |   NULL |
|       3 | Roberts    | Tabitha  | secrétaire recherche    |                2 |          31 | 2002-12-12  |    2225 |       NULL |   0.05 |
|       4 | Dumont     | Fabrice  | manager p-p-s           |                1 |          40 | 2002-12-16  |    3475 |        525 |   NULL |
|       5 | Riddle     | Nixon    | secrétaire de direction |                1 |          21 | 2005-08-07  |    2510 |       NULL |   0.05 |
|       6 | Everett    | Adelaide | secrétaire p-p-s        |                4 |          42 | 2010-06-20  |    2225 |       NULL |   0.05 |
|       7 | Harding    | Israel   | secrétaire p-p-s        |                4 |          42 | 2005-01-26  |    2225 |       NULL |   0.05 |
|       8 | Shields    | Aiyana   | secrétaire p-p-s        |                4 |          42 | 2004-03-15  |    2225 |       NULL |   0.05 |
|       9 | Villarreal | Cael     | chercheur               |                2 |          30 | 2010-03-05  |    3200 |       NULL |   0.05 |
|      10 | Dunlap     | Mila     | laborantin recherche    |                2 |          30 | 2007-08-04  |    2450 |       NULL |   0.05 |
|      11 | Nelson     | Celeste  | manager stock in-out    |                1 |          50 | 2006-05-19  |    3475 |        560 |   NULL |
|      12 | Dillon     | Cullen   | vendeur                 |               15 |          60 | 2003-07-18  |    2725 |       NULL |   0.05 |
|      13 | Fleming    | Harry    | vendeur                 |               15 |          60 | 2007-05-27  |    2725 |       NULL |   0.05 |
|      14 | Bell       | Jimena   | vendeur                 |               15 |          60 | 2011-12-08  |    2725 |       NULL |   0.05 |
|      15 | Wise       | Jayson   | vendeur chef d'équipe   |                1 |          60 | 2012-07-07  |    2995 |       NULL |   0.05 |
|      16 | Hawkins    | Isabelle | secrétariat achat-vente |                1 |          61 | 2013-05-03  |    2225 |       NULL |   0.05 |
+---------+------------+----------+-------------------------+------------------+-------------+-------------+---------+------------+--------+
16 rows in set (0.00 sec)

mysql>

Les attributs sont les suivants : emp_num (clé primaire), nom, prenom, metier, referent_manager, departement, date_entree, salaire, commission, indice.

Le directeur et les managers touchent un salaire fixe + une commission varaible tous les mois.

Les autres employés touchent un salaire fixe tous les mois qui est indexé tous les ans.

Pour info, p-p-s signifie « département production-packaging-stockage » et stock in-out, stockage entrées et sorties.

Des colonnes créées avec un alias :

mysql> SELECT nom AS leur_nom,prenom AS leur_prenom from employes;
+------------+-------------+
| leur_nom   | leur_prenom |
+------------+-------------+
| Scholer    | Georges     |
| Henry      | Thierry     |
| Roberts    | Tabitha     |
| Dumont     | Fabrice     |
| Riddle     | Nixon       |
| Everett    | Adelaide    |
| Harding    | Israel      |
| Shields    | Aiyana      |
| Villarreal | Cael        |
| Dunlap     | Mila        |
| Nelson     | Celeste     |
| Dillon     | Cullen      |
| Fleming    | Harry       |
| Bell       | Jimena      |
| Wise       | Jayson      |
| Hawkins    | Isabelle    |
+------------+-------------+
16 rows in set (0.00 sec)

mysql> SELECT nom,prenom AS leur_prenom from employes;
+------------+-------------+
| nom        | leur_prenom |
+------------+-------------+
| Scholer    | Georges     |
| Henry      | Thierry     |
| Roberts    | Tabitha     |
| Dumont     | Fabrice     |
| Riddle     | Nixon       |
| Everett    | Adelaide    |
| Harding    | Israel      |
| Shields    | Aiyana      |
| Villarreal | Cael        |
| Dunlap     | Mila        |
| Nelson     | Celeste     |
| Dillon     | Cullen      |
| Fleming    | Harry       |
| Bell       | Jimena      |
| Wise       | Jayson      |
| Hawkins    | Isabelle    |
+------------+-------------+
16 rows in set (0.00 sec)

mysql>

SELECT nom AS leur_nom,prenom AS leur_prenom from employes;

Le mot SQL AS permet de changer le nom des deux colonnes

SELECT nom,prenom AS leur_prenom from employes;

Seul la colonne prénom a un alias !

Augmentons tous les salaires de 10 % !

Créons une colonne calculée.

mysql> SELECT nom, prenom, salaire, round(salaire*1.1,0) augmentation FROM employes;
+------------+----------+---------+--------------+
| nom        | prenom   | salaire | augmentation |
+------------+----------+---------+--------------+
| Scholer    | Georges  |    7500 |         8250 |
| Henry      | Thierry  |    3475 |         3823 |
| Roberts    | Tabitha  |    2225 |         2448 |
| Dumont     | Fabrice  |    3475 |         3823 |
| Riddle     | Nixon    |    2510 |         2761 |
| Everett    | Adelaide |    2225 |         2448 |
| Harding    | Israel   |    2225 |         2448 |
| Shields    | Aiyana   |    2225 |         2448 |
| Villarreal | Cael     |    3200 |         3520 |
| Dunlap     | Mila     |    2450 |         2695 |
| Nelson     | Celeste  |    3475 |         3823 |
| Dillon     | Cullen   |    2725 |         2998 |
| Fleming    | Harry    |    2725 |         2998 |
| Bell       | Jimena   |    2725 |         2998 |
| Wise       | Jayson   |    2995 |         3295 |
| Hawkins    | Isabelle |    2225 |         2448 |
+------------+----------+---------+--------------+
16 rows in set (0.00 sec)

mysql>

SELECT nom, prenom, salaire, round(salaire*1.1,0) augmentation FROM employes;

nom, prenom et salaire sont des colonnes existantes. augmentation est une colonne créée dont on calcule les données : round(salaire*1.1,o)

Salaire X 1.1 (+10 %) arrondi à zéro chiffres après la virgule.

Pour Georges Scholer : 7500X1.1 = 8250.

Augmentons cette fois les salaires de 12.5 % avec deux chiffres après la virgule dans une nouvelle colonne « augmentation »:

mysql> SELECT nom, prenom, salaire, round(salaire*1.125,2) augmentation FROM employes;
+------------+----------+---------+--------------+
| nom        | prenom   | salaire | augmentation |
+------------+----------+---------+--------------+
| Scholer    | Georges  |    7500 |      8437.50 |
| Henry      | Thierry  |    3475 |      3909.38 |
| Roberts    | Tabitha  |    2225 |      2503.13 |
| Dumont     | Fabrice  |    3475 |      3909.38 |
| Riddle     | Nixon    |    2510 |      2823.75 |
| Everett    | Adelaide |    2225 |      2503.13 |
| Harding    | Israel   |    2225 |      2503.13 |
| Shields    | Aiyana   |    2225 |      2503.13 |
| Villarreal | Cael     |    3200 |      3600.00 |
| Dunlap     | Mila     |    2450 |      2756.25 |
| Nelson     | Celeste  |    3475 |      3909.38 |
| Dillon     | Cullen   |    2725 |      3065.63 |
| Fleming    | Harry    |    2725 |      3065.63 |
| Bell       | Jimena   |    2725 |      3065.63 |
| Wise       | Jayson   |    2995 |      3369.38 |
| Hawkins    | Isabelle |    2225 |      2503.13 |
+------------+----------+---------+--------------+
16 rows in set (0.00 sec)

mysql>

SELECT nom, prenom, salaire, round(salaire*1.125,2) augmentation FROM employes;

Augmentons de 15 % les salaires supérieurs à 2700 euros avec une colonne en plus précisant le pourcentage :

mysql> SELECT nom, prenom, salaire,15 pourcent,round(salaire*1.15,0) augmentation FROM employes WHERE salaire > 2700;
+------------+---------+---------+----------+--------------+
| nom        | prenom  | salaire | pourcent | augmentation |
+------------+---------+---------+----------+--------------+
| Scholer    | Georges |    7500 |       15 |         8625 |
| Henry      | Thierry |    3475 |       15 |         3996 |
| Dumont     | Fabrice |    3475 |       15 |         3996 |
| Villarreal | Cael    |    3200 |       15 |         3680 |
| Nelson     | Celeste |    3475 |       15 |         3996 |
| Dillon     | Cullen  |    2725 |       15 |         3134 |
| Fleming    | Harry   |    2725 |       15 |         3134 |
| Bell       | Jimena  |    2725 |       15 |         3134 |
| Wise       | Jayson  |    2995 |       15 |         3444 |
+------------+---------+---------+----------+--------------+
9 rows in set (0.00 sec)

mysql>

SELECT nom, prenom, salaire,15 pourcent,round(salaire*1.15,0) augmentation FROM employes WHERE salaire > 2700;

La colonne pourcentage affiche tout simplement une donnée fixe.

Variante > 3000, avec dans la colonne « pourcent » la valeur « 15% » et dans l’ordre croissant des noms

mysql> SELECT nom, prenom, salaire,"15%" pourcent,round(salaire*1.15,0) augmentation FROM employes WHERE salaire > 3000 ORDER BY nom;
+------------+---------+---------+----------+--------------+
| nom        | prenom  | salaire | pourcent | augmentation |
+------------+---------+---------+----------+--------------+
| Dumont     | Fabrice |    3475 | 15%      |         3996 |
| Henry      | Thierry |    3475 | 15%      |         3996 |
| Nelson     | Celeste |    3475 | 15%      |         3996 |
| Scholer    | Georges |    7500 | 15%      |         8625 |
| Villarreal | Cael    |    3200 | 15%      |         3680 |
+------------+---------+---------+----------+--------------+
5 rows in set (0.00 sec)

mysql>

SELECT nom, prenom, salaire, »15% » pourcent,round(salaire*1.15,0) augmentation FROM employes WHERE salaire > 3000 ORDER BY nom;

Sélectionnons maintenant les employés ayant un salaire indexé afin de calculer leur nouveau salaire :

mysql> SELECT nom,prenom, salaire, round ((salaire*indice)+salaire,2) nouveauSalaire FROM employes;
+------------+----------+---------+----------------+
| nom        | prenom   | salaire | nouveauSalaire |
+------------+----------+---------+----------------+
| Scholer    | Georges  |    7500 |           NULL |
| Henry      | Thierry  |    3475 |           NULL |
| Roberts    | Tabitha  |    2225 |        2336.25 |
| Dumont     | Fabrice  |    3475 |           NULL |
| Riddle     | Nixon    |    2510 |        2635.50 |
| Everett    | Adelaide |    2225 |        2336.25 |
| Harding    | Israel   |    2225 |        2336.25 |
| Shields    | Aiyana   |    2225 |        2336.25 |
| Villarreal | Cael     |    3200 |        3360.00 |
| Dunlap     | Mila     |    2450 |        2572.50 |
| Nelson     | Celeste  |    3475 |           NULL |
| Dillon     | Cullen   |    2725 |        2861.25 |
| Fleming    | Harry    |    2725 |        2861.25 |
| Bell       | Jimena   |    2725 |        2861.25 |
| Wise       | Jayson   |    2995 |        3144.75 |
| Hawkins    | Isabelle |    2225 |        2336.25 |
+------------+----------+---------+----------------+
16 rows in set (0.00 sec)

mysql>

SELECT nom,prenom, salaire, round ((salaire*indice)+salaire,2) nouveauSalaire FROM employes;

Attention, la tentation est forte de calculer les données d’une colonne inexistante en utilisant une colonne, elle aussi, inexistante créée dans le même temps.

Exemple :

  • Colonnes existantes : nom,prenom, salaire
  • Colonnes créées : round (salaire*indice,2) indexeSalaire, round (salaire+indexeSalaire,2) nouveauSalaire

nouveauSalaire étant calculé ainsi -> salaire+indexSalaire

indexSalaire étant une colonne créée, nous ne pouvons l’utiliser dans le calcul d’une autre colonne créée. MySQL ou MariaDB signaleront une erreur :

Champ ‘indexeSalaire’ inconnu dans field list

mysql> SELECT nom,prenom, salaire, round (salaire*indice,2) indexeSalaire, round (salaire+indexeSalaire,2) nouveauSalaire FROM employes;
ERROR 1054 (42S22): Champ 'indexeSalaire' inconnu dans field list
mysql>

SELECT nom,prenom, salaire, round (salaire*indice,2) indexeSalaire, round (salaire+indexeSalaire,2) nouveauSalaire FROM employes;

Voici la commande correcte :

mysql> SELECT nom,prenom, salaire, round (salaire*indice,2) augmentationAnnuelle, round ((salaire*indice)+salaire,2) nouveauSalaire FROM employes;
+------------+----------+---------+----------------------+----------------+
| nom        | prenom   | salaire | augmentationAnnuelle | nouveauSalaire |
+------------+----------+---------+----------------------+----------------+
| Scholer    | Georges  |    7500 |                 NULL |           NULL |
| Henry      | Thierry  |    3475 |                 NULL |           NULL |
| Roberts    | Tabitha  |    2225 |               111.25 |        2336.25 |
| Dumont     | Fabrice  |    3475 |                 NULL |           NULL |
| Riddle     | Nixon    |    2510 |               125.50 |        2635.50 |
| Everett    | Adelaide |    2225 |               111.25 |        2336.25 |
| Harding    | Israel   |    2225 |               111.25 |        2336.25 |
| Shields    | Aiyana   |    2225 |               111.25 |        2336.25 |
| Villarreal | Cael     |    3200 |               160.00 |        3360.00 |
| Dunlap     | Mila     |    2450 |               122.50 |        2572.50 |
| Nelson     | Celeste  |    3475 |                 NULL |           NULL |
| Dillon     | Cullen   |    2725 |               136.25 |        2861.25 |
| Fleming    | Harry    |    2725 |               136.25 |        2861.25 |
| Bell       | Jimena   |    2725 |               136.25 |        2861.25 |
| Wise       | Jayson   |    2995 |               149.75 |        3144.75 |
| Hawkins    | Isabelle |    2225 |               111.25 |        2336.25 |
+------------+----------+---------+----------------------+----------------+
16 rows in set (0.00 sec)

mysql>

SELECT nom,prenom, salaire, round (salaire*indice,2) augmentationAnnuelle, round ((salaire*indice)+salaire,2) nouveauSalaire FROM employes;

Nous n’utilisons ici que des colonnes existantes dans nos calculs !

mysql> SELECT nom,prenom, salaire, round (salaire*indice,2) augmentationAnnuelle, round ((salaire*indice)+salaire,2) nouveauSalaire FROM employes WHERE indice IS NOT NULL;
+------------+----------+---------+----------------------+----------------+
| nom        | prenom   | salaire | augmentationAnnuelle | nouveauSalaire |
+------------+----------+---------+----------------------+----------------+
| Roberts    | Tabitha  |    2225 |               111.25 |        2336.25 |
| Riddle     | Nixon    |    2510 |               125.50 |        2635.50 |
| Everett    | Adelaide |    2225 |               111.25 |        2336.25 |
| Harding    | Israel   |    2225 |               111.25 |        2336.25 |
| Shields    | Aiyana   |    2225 |               111.25 |        2336.25 |
| Villarreal | Cael     |    3200 |               160.00 |        3360.00 |
| Dunlap     | Mila     |    2450 |               122.50 |        2572.50 |
| Dillon     | Cullen   |    2725 |               136.25 |        2861.25 |
| Fleming    | Harry    |    2725 |               136.25 |        2861.25 |
| Bell       | Jimena   |    2725 |               136.25 |        2861.25 |
| Wise       | Jayson   |    2995 |               149.75 |        3144.75 |
| Hawkins    | Isabelle |    2225 |               111.25 |        2336.25 |
+------------+----------+---------+----------------------+----------------+
12 rows in set (0.00 sec)

mysql>

SELECT nom,prenom, salaire, round (salaire*indice,2) augmentationAnnuelle, round ((salaire*indice)+salaire,2) nouveauSalaire FROM employes WHERE indice IS NOT NULL;

Nous sélectionnons les employés ayant un salaire indexable, c’est à dire ayant des données dans la colonne « indice » et donc dont le champ n’est pas « NULL » !

Pour être absolument complet :

mysql> SELECT nom,prenom, salaire, indice, round (salaire*indice,2) augmentationAnnuelle, round ((salaire*indice)+salaire,2) nouveauSalaire FROM employes WHERE indice IS NOT NULL;
+------------+----------+---------+--------+----------------------+----------------+
| nom        | prenom   | salaire | indice | augmentationAnnuelle | nouveauSalaire |
+------------+----------+---------+--------+----------------------+----------------+
| Roberts    | Tabitha  |    2225 |   0.05 |               111.25 |        2336.25 |
| Riddle     | Nixon    |    2510 |   0.05 |               125.50 |        2635.50 |
| Everett    | Adelaide |    2225 |   0.05 |               111.25 |        2336.25 |
| Harding    | Israel   |    2225 |   0.05 |               111.25 |        2336.25 |
| Shields    | Aiyana   |    2225 |   0.05 |               111.25 |        2336.25 |
| Villarreal | Cael     |    3200 |   0.05 |               160.00 |        3360.00 |
| Dunlap     | Mila     |    2450 |   0.05 |               122.50 |        2572.50 |
| Dillon     | Cullen   |    2725 |   0.05 |               136.25 |        2861.25 |
| Fleming    | Harry    |    2725 |   0.05 |               136.25 |        2861.25 |
| Bell       | Jimena   |    2725 |   0.05 |               136.25 |        2861.25 |
| Wise       | Jayson   |    2995 |   0.05 |               149.75 |        3144.75 |
| Hawkins    | Isabelle |    2225 |   0.05 |               111.25 |        2336.25 |
+------------+----------+---------+--------+----------------------+----------------+
12 rows in set (0.00 sec)

mysql>

SELECT nom,prenom, salaire, indice, round (salaire*indice,2) augmentationAnnuelle, round ((salaire*indice)+salaire,2) nouveauSalaire FROM employes WHERE indice IS NOT NULL;

La clause WHERE est toujours insérée après le nom de la table comme GROUP BY ou ORDER BY.

Nous sélectionnons les employés qui ont un salaire et touchent tous les mois une commission. Seulement ces employés !

mysql> SELECT nom,prenom,salaire,commission,salaire+commission salComm FROM employes WHERE commission IS NOT NULL;
+---------+---------+---------+------------+---------+
| nom     | prenom  | salaire | commission | salComm |
+---------+---------+---------+------------+---------+
| Scholer | Georges |    7500 |       1950 |    9450 |
| Henry   | Thierry |    3475 |        450 |    3925 |
| Dumont  | Fabrice |    3475 |        525 |    4000 |
| Nelson  | Celeste |    3475 |        560 |    4035 |
+---------+---------+---------+------------+---------+
4 rows in set (0.03 sec)

mysql>

SELECT nom,prenom,salaire,commission,salaire+commission salComm FROM employes WHERE commission IS NOT NULL;

A la fin du mois, quelque soit l’employé, il doit toucher son salaire :

mysql> SELECT nom,prenom,salaire,commission,salaire+commission salAvecComm,salaire+ifnull(commission,0) salAvecEtSansComm FROM employes;
+------------+----------+---------+------------+-------------+-------------------+
| nom        | prenom   | salaire | commission | salAvecComm | salAvecEtSansComm |
+------------+----------+---------+------------+-------------+-------------------+
| Scholer    | Georges  |    7500 |       1950 |        9450 |              9450 |
| Henry      | Thierry  |    3475 |        450 |        3925 |              3925 |
| Roberts    | Tabitha  |    2225 |       NULL |        NULL |              2225 |
| Dumont     | Fabrice  |    3475 |        525 |        4000 |              4000 |
| Riddle     | Nixon    |    2510 |       NULL |        NULL |              2510 |
| Everett    | Adelaide |    2225 |       NULL |        NULL |              2225 |
| Harding    | Israel   |    2225 |       NULL |        NULL |              2225 |
| Shields    | Aiyana   |    2225 |       NULL |        NULL |              2225 |
| Villarreal | Cael     |    3200 |       NULL |        NULL |              3200 |
| Dunlap     | Mila     |    2450 |       NULL |        NULL |              2450 |
| Nelson     | Celeste  |    3475 |        560 |        4035 |              4035 |
| Dillon     | Cullen   |    2725 |       NULL |        NULL |              2725 |
| Fleming    | Harry    |    2725 |       NULL |        NULL |              2725 |
| Bell       | Jimena   |    2725 |       NULL |        NULL |              2725 |
| Wise       | Jayson   |    2995 |       NULL |        NULL |              2995 |
| Hawkins    | Isabelle |    2225 |       NULL |        NULL |              2225 |
+------------+----------+---------+------------+-------------+-------------------+
16 rows in set (0.00 sec)

mysql>

SELECT nom,prenom,salaire,commission,salaire+commission salAvecComm,salaire+ifnull(commission,0) salAvecEtSansComm FROM employes;

salaire+ifnull(commission,0) salAvecEtSansComm -> salaire + 0 si la commission est NULL

Augmentons le salaire des employés du département 30 de 10 % et les employés du département 40 de 15% sinon les autres touchent leur salaire de base.

mysql> SELECT nom,prenom,salaire,departement,CASE departement
        -> WHEN 30 THEN 1.1 WHEN 40 THEN 1.15 ELSE 1 END
        -> * salaire AS nouv_salaire FROM employes;
+------------+----------+---------+-------------+--------------+
| nom        | prenom   | salaire | departement | nouv_salaire |
+------------+----------+---------+-------------+--------------+
| Scholer    | Georges  |    7500 |          20 |      7500.00 |
| Henry      | Thierry  |    3475 |          30 |      3822.50 |
| Roberts    | Tabitha  |    2225 |          31 |      2225.00 |
| Dumont     | Fabrice  |    3475 |          40 |      3996.25 |
| Riddle     | Nixon    |    2510 |          21 |      2510.00 |
| Everett    | Adelaide |    2225 |          42 |      2225.00 |
| Harding    | Israel   |    2225 |          42 |      2225.00 |
| Shields    | Aiyana   |    2225 |          42 |      2225.00 |
| Villarreal | Cael     |    3200 |          30 |      3520.00 |
| Dunlap     | Mila     |    2450 |          30 |      2695.00 |
| Nelson     | Celeste  |    3475 |          50 |      3475.00 |
| Dillon     | Cullen   |    2725 |          60 |      2725.00 |
| Fleming    | Harry    |    2725 |          60 |      2725.00 |
| Bell       | Jimena   |    2725 |          60 |      2725.00 |
| Wise       | Jayson   |    2995 |          60 |      2995.00 |
| Hawkins    | Isabelle |    2225 |          61 |      2225.00 |
+------------+----------+---------+-------------+--------------+
16 rows in set (0.05 sec)

mysql>

SELECT nom,prenom,salaire,departement,CASE departement

-> WHEN 30 THEN 1.1 WHEN 40 THEN 1.15 ELSE 1 END

-> * salaire AS nouv_salaire FROM employes;

Même opération avec 3 chiffres après la virgule :

mysql> SELECT nom,prenom,salaire,departement,round(CASE departement WHEN 30 THEN 1.1
        -> WHEN 40 THEN 1.15 ELSE 1 END * salaire,3) AS nouv_salaire FROM employes;
+------------+----------+---------+-------------+--------------+
| nom        | prenom   | salaire | departement | nouv_salaire |
+------------+----------+---------+-------------+--------------+
| Scholer    | Georges  |    7500 |          20 |     7500.000 |
| Henry      | Thierry  |    3475 |          30 |     3822.500 |
| Roberts    | Tabitha  |    2225 |          31 |     2225.000 |
| Dumont     | Fabrice  |    3475 |          40 |     3996.250 |
| Riddle     | Nixon    |    2510 |          21 |     2510.000 |
| Everett    | Adelaide |    2225 |          42 |     2225.000 |
| Harding    | Israel   |    2225 |          42 |     2225.000 |
| Shields    | Aiyana   |    2225 |          42 |     2225.000 |
| Villarreal | Cael     |    3200 |          30 |     3520.000 |
| Dunlap     | Mila     |    2450 |          30 |     2695.000 |
| Nelson     | Celeste  |    3475 |          50 |     3475.000 |
| Dillon     | Cullen   |    2725 |          60 |     2725.000 |
| Fleming    | Harry    |    2725 |          60 |     2725.000 |
| Bell       | Jimena   |    2725 |          60 |     2725.000 |
| Wise       | Jayson   |    2995 |          60 |     2995.000 |
| Hawkins    | Isabelle |    2225 |          61 |     2225.000 |
+------------+----------+---------+-------------+--------------+
16 rows in set (0.02 sec)

mysql>

SELECT nom,prenom,salaire,departement,round(CASE departement WHEN 30 THEN 1.1

-> WHEN 40 THEN 1.15 ELSE 1 END * salaire,3) AS nouv_salaire FROM employes;

Pour vous montrer que le langage SQL est très modulable dans sa syntaxe :

mysql> SELECT nom,prenom,salaire,departement,round(CASE WHEN departement=30 THEN salaire+200
        -> WHEN departement>30 THEN salaire+300 ELSE salaire END,3) AS nouv_salaire FROM employes;
+------------+----------+---------+-------------+--------------+
| nom        | prenom   | salaire | departement | nouv_salaire |
+------------+----------+---------+-------------+--------------+
| Scholer    | Georges  |    7500 |          20 |         7500 |
| Henry      | Thierry  |    3475 |          30 |         3675 |
| Roberts    | Tabitha  |    2225 |          31 |         2525 |
| Dumont     | Fabrice  |    3475 |          40 |         3775 |
| Riddle     | Nixon    |    2510 |          21 |         2510 |
| Everett    | Adelaide |    2225 |          42 |         2525 |
| Harding    | Israel   |    2225 |          42 |         2525 |
| Shields    | Aiyana   |    2225 |          42 |         2525 |
| Villarreal | Cael     |    3200 |          30 |         3400 |
| Dunlap     | Mila     |    2450 |          30 |         2650 |
| Nelson     | Celeste  |    3475 |          50 |         3775 |
| Dillon     | Cullen   |    2725 |          60 |         3025 |
| Fleming    | Harry    |    2725 |          60 |         3025 |
| Bell       | Jimena   |    2725 |          60 |         3025 |
| Wise       | Jayson   |    2995 |          60 |         3295 |
| Hawkins    | Isabelle |    2225 |          61 |         2525 |
+------------+----------+---------+-------------+--------------+
16 rows in set (0.03 sec)

mysql>

SELECT nom,prenom,salaire,departement,round(CASE WHEN departement=30 THEN salaire+200

-> WHEN departement>30 THEN salaire+300 ELSE salaire END,3) AS nouv_salaire FROM employes;

Pour être très complet, tout le monde est augmenté avec commission ou indice :

mysql> SELECT nom,prenom,salaire,commission,indice,salaire+commission salAvecComm,
        -> round (salaire+(salaire*indice),2) salIndexe,
        -> CASE WHEN commission IS NOT NULL THEN commission
        -> ELSE salaire*indice  END +salaire AS salairePourTous FROM employes;
+------------+----------+---------+------------+--------+-------------+-----------+--------------------+
| nom        | prenom   | salaire | commission | indice | salAvecComm | salIndexe | salairePourTous    |
+------------+----------+---------+------------+--------+-------------+-----------+--------------------+
| Scholer    | Georges  |    7500 |       1950 |   NULL |        9450 |      NULL |               9450 |
| Henry      | Thierry  |    3475 |        450 |   NULL |        3925 |      NULL |               3925 |
| Roberts    | Tabitha  |    2225 |       NULL |   0.05 |        NULL |   2336.25 |  2336.250001657754 |
| Dumont     | Fabrice  |    3475 |        525 |   NULL |        4000 |      NULL |               4000 |
| Riddle     | Nixon    |    2510 |       NULL |   0.05 |        NULL |   2635.50 | 2635.5000018700957 |
| Everett    | Adelaide |    2225 |       NULL |   0.05 |        NULL |   2336.25 |  2336.250001657754 |
| Harding    | Israel   |    2225 |       NULL |   0.05 |        NULL |   2336.25 |  2336.250001657754 |
| Shields    | Aiyana   |    2225 |       NULL |   0.05 |        NULL |   2336.25 |  2336.250001657754 |
| Villarreal | Cael     |    3200 |       NULL |   0.05 |        NULL |   3360.00 |  3360.000002384186 |
| Dunlap     | Mila     |    2450 |       NULL |   0.05 |        NULL |   2572.50 | 2572.5000018253922 |
| Nelson     | Celeste  |    3475 |        560 |   NULL |        4035 |      NULL |               4035 |
| Dillon     | Cullen   |    2725 |       NULL |   0.05 |        NULL |   2861.25 |  2861.250002030283 |
| Fleming    | Harry    |    2725 |       NULL |   0.05 |        NULL |   2861.25 |  2861.250002030283 |
| Bell       | Jimena   |    2725 |       NULL |   0.05 |        NULL |   2861.25 |  2861.250002030283 |
| Wise       | Jayson   |    2995 |       NULL |   0.05 |        NULL |   3144.75 |  3144.750002231449 |
| Hawkins    | Isabelle |    2225 |       NULL |   0.05 |        NULL |   2336.25 |  2336.250001657754 |
+------------+----------+---------+------------+--------+-------------+-----------+--------------------+
16 rows in set (0.00 sec)

mysql>

SELECT nom,prenom,salaire,commission,indice,salaire+commission salAvecComm,

-> round (salaire+(salaire*indice),2) salIndexe,

-> CASE WHEN commission IS NOT NULL THEN commission

-> ELSE salaire*indice END +salaire AS salairePourTous FROM employes;

Le résultat n’est pas très joli, joli en dernière colonne !

Je vous propose donc ceci :

mysql> SELECT nom,prenom,salaire,commission,indice,salaire+commission salAvecComm,
        -> round (salaire+(salaire*indice),2) salIndexe,
        -> CASE WHEN commission IS NOT NULL THEN salaire+commission
        -> ELSE round (salaire+(salaire*indice),2) END AS salairePlusPourTous
        -> FROM employes;
+------------+----------+---------+------------+--------+-------------+-----------+---------------------+
| nom        | prenom   | salaire | commission | indice | salAvecComm | salIndexe | salairePlusPourTous |
+------------+----------+---------+------------+--------+-------------+-----------+---------------------+
| Scholer    | Georges  |    7500 |       1950 |   NULL |        9450 |      NULL |             9450.00 |
| Henry      | Thierry  |    3475 |        450 |   NULL |        3925 |      NULL |             3925.00 |
| Roberts    | Tabitha  |    2225 |       NULL |   0.05 |        NULL |   2336.25 |             2336.25 |
| Dumont     | Fabrice  |    3475 |        525 |   NULL |        4000 |      NULL |             4000.00 |
| Riddle     | Nixon    |    2510 |       NULL |   0.05 |        NULL |   2635.50 |             2635.50 |
| Everett    | Adelaide |    2225 |       NULL |   0.05 |        NULL |   2336.25 |             2336.25 |
| Harding    | Israel   |    2225 |       NULL |   0.05 |        NULL |   2336.25 |             2336.25 |
| Shields    | Aiyana   |    2225 |       NULL |   0.05 |        NULL |   2336.25 |             2336.25 |
| Villarreal | Cael     |    3200 |       NULL |   0.05 |        NULL |   3360.00 |             3360.00 |
| Dunlap     | Mila     |    2450 |       NULL |   0.05 |        NULL |   2572.50 |             2572.50 |
| Nelson     | Celeste  |    3475 |        560 |   NULL |        4035 |      NULL |             4035.00 |
| Dillon     | Cullen   |    2725 |       NULL |   0.05 |        NULL |   2861.25 |             2861.25 |
| Fleming    | Harry    |    2725 |       NULL |   0.05 |        NULL |   2861.25 |             2861.25 |
| Bell       | Jimena   |    2725 |       NULL |   0.05 |        NULL |   2861.25 |             2861.25 |
| Wise       | Jayson   |    2995 |       NULL |   0.05 |        NULL |   3144.75 |             3144.75 |
| Hawkins    | Isabelle |    2225 |       NULL |   0.05 |        NULL |   2336.25 |             2336.25 |
+------------+----------+---------+------------+--------+-------------+-----------+---------------------+
16 rows in set (0.00 sec)

mysql>

SELECT nom,prenom,salaire,commission,indice,salaire+commission salAvecComm,

-> round (salaire+(salaire*indice),2) salIndexe,

-> CASE WHEN commission IS NOT NULL THEN salaire+commission

-> ELSE round (salaire+(salaire*indice),2) END AS salairePlusPourTous

-> FROM employes;

Remarquez que toutes les valeurs de la dernière colonne sont arrondies à 2 chiffres derrière la virgule alors que je ne l’avais demandé que pour les salaires indexés !