Sqlserver
 sql >> Base de données >  >> RDS >> Sqlserver

Comment appliquer une mise en forme conditionnelle à un nombre dans SQL Server à l'aide de FORMAT()

Peut-être l'une des fonctionnalités les moins connues du FORMAT() La fonction dans SQL Server est celle qui vous permet d'appliquer une mise en forme conditionnelle à un nombre.

Il s'agit plus d'une fonctionnalité .NET que d'une fonctionnalité SQL Server (ou T-SQL), mais SQL Server/T-SQL la prend tout de même en charge, vous permettant de tirer pleinement parti de la possibilité d'appliquer une mise en forme conditionnelle aux nombres.

Tout se résume à la chaîne de format que vous transmettez au FORMAT() une fonction.

Vous pouvez passer une chaîne de format qui spécifie comment le nombre doit être formaté, selon qu'il est positif, négatif ou zéro.

Juste pour être clair, je ne parle pas de formater le nombre avec des couleurs ou des polices, etc. Je parle uniquement du formatage des nombres que vous utiliseriez normalement le FORMAT() fonction pour (comme l'ajout de séparateurs de milliers, de signes de pourcentage, de points décimaux, etc.).

De plus, cette mise en forme conditionnelle est assez limitée - seules trois conditions peuvent être testées (positive, négative ou zéro). Cependant, vous pouvez également appliquer le même formatage à deux conditions à la fois si nécessaire.

Dans tous les cas, voici comment utiliser le FORMAT() fonction pour appliquer une mise en forme conditionnelle à un nombre dans SQL Server.

Présentation de ; – Le séparateur de section

.NET définit le point-virgule (; ) comme l'un de ses spécificateurs de format numérique personnalisé, appelé séparateur de section .

Le séparateur de section est un spécificateur de format conditionnel qui définit des sections avec des chaînes de format distinctes pour les nombres positifs, négatifs et nuls. Cela vous permet d'appliquer une mise en forme différente à un nombre selon que sa valeur est positive, négative ou nulle.

Une chaîne de format numérique personnalisée peut contenir jusqu'à trois sections séparées par des points-virgules. Ce sont les suivants :

  • Une rubrique :Aucune mise en forme conditionnelle ne s'applique dans ce cas. La chaîne de format s'applique à toutes les valeurs. Aucun séparateur de section n'est nécessaire (car il n'y a qu'une seule section). Il s'agit sans aucun doute de la forme la plus courante de chaîne de format.
  • Deux sections :La première section s'applique aux valeurs positives et aux zéros, et la deuxième section s'applique aux valeurs négatives.

    Si le nombre à formater est négatif, mais devient zéro après arrondi selon le format de la deuxième section, le zéro résultant est formaté selon la première section.

  • Trois sections :La première section s'applique aux valeurs positives, la deuxième section s'applique aux valeurs négatives et la troisième section s'applique aux zéros.

    La deuxième section peut être laissée vide (en n'ayant rien entre les points-virgules), auquel cas la première section s'applique à toutes les valeurs non nulles.

    Si le nombre à formater est différent de zéro, mais devient zéro après arrondi selon le format dans la première ou la deuxième section, le zéro résultant est formaté selon la troisième section.

Notez que les valeurs négatives sont toujours affichées sans signe moins lorsque des séparateurs de section sont utilisés (bien qu'il y ait des exceptions, comme vous le verrez plus tard). Si vous souhaitez que la valeur formatée finale ait un signe moins, vous devez inclure explicitement le signe moins dans la chaîne de format personnalisée. Cela s'applique également à tout autre formatage préexistant associé à un nombre.

Exemple 1 - Une section (pas de mise en forme conditionnelle)

Voici une chaîne de format numérique typique composée d'une section. Aucun séparateur de section n'est utilisé, et donc aucune mise en forme conditionnelle ne s'applique .

Code :

SELECT 
  FORMAT(123, '0 (Number)') Positive,
  FORMAT(-123, '0 (Number)') Negative,
  FORMAT(0, '0 (Number)') Zero;

Résultat :

+--------------+---------------+------------+
| Positive     | Negative      | Zero       |
|--------------+---------------+------------|
| 123 (Number) | -123 (Number) | 0 (Number) |
+--------------+---------------+------------+

Notez que le signe moins reste intact. Cela aurait été supprimé si nous avions utilisé des séparateurs de section.

Exemple 2 – Deux sections (mise en forme conditionnelle)

C'est ici que commence la mise en forme conditionnelle.

Dans cet exemple, nous avons deux sections (séparées par un séparateur de section). La section à gauche du séparateur ne s'applique qu'aux valeurs positives ou nulles. La section de droite ne s'applique qu'aux valeurs négatives.

Code :

SELECT FORMAT(123,  '0 (Positive or Zero); 0 (Negative)') Result;

Résultat :

+------------------------+
| Result                 |
|------------------------|
| 123 (Positive or Zero) |
+------------------------+

Dans ce cas, le nombre était positif, donc la première section a été utilisée pour le formater.

Exemple 3 – Deux sections (même chaîne de format, valeurs différentes)

Dans l'exemple suivant, la même chaîne de format est appliquée à différentes valeurs (positives, négatives et zéro).

Code :

SELECT 
  FORMAT(123,  '0 (Positive or Zero); 0 (Negative)') Positive,
  FORMAT(-123, '0 (Positive or Zero); 0 (Negative)') Negative,
  FORMAT(0,    '0 (Positive or Zero); 0 (Negative)') Zero;

Résultat :

+------------------------+-----------------+----------------------+
| Positive               | Negative        | Zero                 |
|------------------------+-----------------+----------------------|
| 123 (Positive or Zero) |  123 (Negative) | 0 (Positive or Zero) |
+------------------------+-----------------+----------------------+

Cet exemple démontre donc le véritable avantage des séparateurs de section :nous pouvons obtenir un résultat différent en fonction de la valeur.

Exemple 4 - Deux sections avec arrondi

Lorsque vous utilisez deux sections, toutes les valeurs négatives arrondies à zéro sont formatées sous la première chaîne de format.

Code :

SELECT 
  FORMAT(0.1,  '0 (Positive or Zero); 0 (Negative)') Positive,
  FORMAT(-0.1, '0 (Positive or Zero); 0 (Negative)') Negative;

Résultat :

+----------------------+----------------------+
| Positive             | Negative             |
|----------------------+----------------------|
| 0 (Positive or Zero) | 0 (Positive or Zero) |
+----------------------+----------------------+

Exemple 5 - Trois sections (utilisation de base)

Voici un exemple de base de spécification de trois sections. Nous utilisons deux séparateurs de section pour y parvenir.

Code :

SELECT FORMAT(123, '0 (Positive); 0 (Negative); 0 (Zero)') Result;

Résultat :

+----------------+
| Result         |
|----------------|
| 123 (Positive) |
+----------------+

Dans ce cas, le nombre était une valeur positive, il a donc été formaté sous la première section.

Exemple 6 - Trois sections (même chaîne de format, valeurs différentes)

Cet exemple montre les différents résultats que nous pourrions obtenir à partir de l'exemple précédent, en fonction de la valeur d'entrée.

Ici, la même chaîne de format est appliquée à différentes valeurs. J'attribue également la chaîne de format à une variable, mais c'est juste pour faciliter la lecture.

DECLARE @formatstring varchar(35);
SET @formatstring = '0 (Positive); 0 (Negative); 0 (Zero)';
SELECT 
  FORMAT(123,   @formatstring) 'Positive',
  FORMAT(-123,  @formatstring) 'Negative',
  FORMAT(0,     @formatstring) 'Zero',
  FORMAT(0.123, @formatstring) 'Rounded to Zero';

Résultat :

+----------------+-----------------+----------+-------------------+
| Positive       | Negative        | Zero     | Rounded to Zero   |
|----------------+-----------------+----------+-------------------|
| 123 (Positive) |  123 (Negative) |  0 (Zero |  0 (Zero          |
+----------------+-----------------+----------+-------------------+

Exemple 7 - Trois sections (dont une vide)

Si vous laissez la deuxième chaîne de format vide, la première section s'applique à toutes les valeurs non nulles. Pour le laisser vide, ne laissez rien entre les points-virgules.

Code :

SELECT 
  FORMAT(123,   '0 (Nonzero);; 0 (Zero)') 'Positive',
  FORMAT(-123,  '0 (Nonzero);; 0 (Zero)') 'Negative',
  FORMAT(0,     '0 (Nonzero);; 0 (Zero)') 'Zero',
  FORMAT(0.123, '0 (Nonzero);; 0 (Zero)') 'Rounded to Zero';

Résultat :

+---------------+----------------+-----------+-------------------+
| Positive      | Negative       | Zero      | Rounded to Zero   |
|---------------+----------------+-----------+-------------------|
| 123 (Nonzero) | -123 (Nonzero) |  0 (Zero) |  0 (Zero)         |
+---------------+----------------+-----------+-------------------+

Fait intéressant, dans ce cas, le signe moins de la valeur négative est laissé intact.

Exemple 8 - Le signe moins

Comme mentionné, le séparateur de section ignore tout formatage préexistant associé au numéro. Cela inclut tout signe moins pour les valeurs négatives (bien que l'exemple précédent semble être une exception).

Si vous souhaitez inclure le signe moins, vous devrez l'ajouter explicitement à votre chaîne de format. Exemple ci-dessous.

Code :

SELECT 
  FORMAT(-123, '0 (P); 0 (N); 0 (Z)') 'Without minus sign',
  FORMAT(-123, '0 (P); -0 (N); 0 (Z)') 'With minus sign';

Résultat :

+----------------------+-------------------+
| Without minus sign   | With minus sign   |
|----------------------+-------------------|
|  123 (N)             |  -123 (N)         |
+----------------------+-------------------+

Comme indiqué, l'exemple précédent semble être une exception à cela, donc quelque chose à garder à l'esprit. Voici ce qui se passe si j'ajoute un signe moins à la chaîne de format pour la valeur négative dans l'exemple précédent :

SELECT FORMAT(-123,  '-0 (Nonzero);; 0 (Zero)') Result;

Résultat :

+-----------------+
| Result          |
|-----------------|
| --123 (Nonzero) |
+-----------------+