2 votes

MySQL - afficher la valeur d'un champ uniquement dans la première instance de chaque valeur groupée ?

Je ne pense pas que cela soit possible, mais j'aimerais qu'on me prouve le contraire.

J'ai écrit une classe de visualisation de rapport simple pour afficher les résultats de diverses requêtes de base de données. Afin d'améliorer l'affichage, lorsque j'ai un rapport avec des données groupées, j'aimerais afficher la valeur du champ uniquement sur la première ligne de chaque valeur unique - et j'aimerais le faire au niveau de la requête, sinon cela nécessiterait une logique supplémentaire dans ma classe pour déterminer ces valeurs spéciales.

Il sera sans doute utile d'illustrer mes besoins par un exemple simple. Imaginez cet ensemble de données :

Year    Quarter    Total
2008    Q1         20
2008    Q2         25
2008    Q3         35
2008    Q4         40
2009    Q1         15
2009    Q2         20
2009    Q3         30
2009    Q4         35

Si possible, j'aimerais que l'ensemble de données soit retourné sous la forme :

Year    Quarter    Total
2008    Q1         20
        Q2         25
        Q3         35
        Q4         40
2009    Q1         15
        Q2         20
        Q3         30
        Q4         35

Existe-t-il un moyen d'effectuer cette opération de manière programmatique dans MySQL ?

7voto

Quassnoi Points 191041
SELECT  CASE WHEN @r = year THEN NULL ELSE year END AS year,
        quarter,
        total,
        @r := year
FROM    (
        SELECT  @r := 0
        ) vars,
        mytable
ORDER BY
        year

@r est une variable de session. Vous pouvez les utiliser dans MySQL comme n'importe quelle variable dans n'importe quel langage procédural.

Tout d'abord, il est initialisé à zéro dans la sous-requête.

Deuxièmement, il est vérifié dans le SELECT clause. Si la valeur actuelle de @r n'est pas égal à year , alors le year est émise, sinon NULL est produite.

Troisièmement, il est mis à jour avec la valeur actuelle de year .

4voto

VVS Points 11528

Pourquoi voulez-vous faire cela ? Qu'en est-il des enregistrements existants dont la colonne Année est vide ou nulle ?

L'embellissement de la sortie relève de la logique du rapport. En pseudo-code, ce serait quelque chose comme :

var lastYear = 0
foreach (record in records)
{
   if (record.Year == lastYear)
   {
     print "   "
   }
   else
   {
     print record.Year
     lastYear = record.Year
   }

   // print the other columns
 }

1voto

Matchu Points 37755

Ce n'est pas la réponse que vous avez demandée, mais...

Il semble que ce ne soit pas une bonne chose à faire avec MySQL en premier lieu. En regardant les lignes de données brutes, les T2 de 2008 et 2009 ne semblent pas avoir beaucoup de sens en tant que lignes de données. Il s'agit d'un problème de présentation, et non d'une question de récupération de données. Cela ressemble plus à quelque chose à écrire dans votre classe de visualisation - quand on lui passe un certain paramètre, par exemple, elle saura ne pas répéter des choses comme "2008".

Cela permet également une plus grande réutilisation du code : plutôt que de réécrire la requête lorsque vous souhaitez présenter les données différemment, par exemple par trimestre plutôt que par année, vous pouvez simplement modifier l'un des arguments de la classe de visualisation afin que la même requête avec une clause d'ordre différente puisse être produite :

Quarter   Year   Total
Q1        2008   20
          2009   15
Q2        2008   25
          2009   20
...

1voto

Cela ne correspond pas exactement à votre demande, mais je préfère pivoter mon tableau. Cela permet de comparer visuellement les chiffres des deux années puisque vous avez un trimestre par colonne :

SELECT Year, 
       SUM(IF(Quarter="Q1", Rev, 0)) AS Q1,
       SUM(IF(Quarter="Q2", Rev, 0)) AS Q2, 
       SUM(IF(Quarter="Q3", Rev, 0)) AS Q3, 
       SUM(IF(Quarter="Q4", Rev, 0)) AS Q4 
FROM t1 GROUP BY 1
ORDER BY 1

Vous avez alors :

YEAR Q1   Q2   Q3   Q4
2008
2009

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X