2009-06-16 10 views
1
  • Je crée un JasperReport en utilisant iReport, et en tant que tel, je suis limité * à une requête SQL.Comment faire pour interroger plusieurs SOMMES du même élément en utilisant SQL dans iReport

  • J'ai une table 'statistics', avec des colonnes 'name' (VARCHAR), 'count' (INTEGER) et 'datetime' (DATETIME).

  • Il est assez simple d'obtenir la somme de la colonne « count » lorsque le « nom » était « test » pour le dernier jour, et de même pour la semaine dernière, et le mois (voir ci-dessous)

travail déclaration SQL:


SELECT 
    SUM(count)as 'today' 
FROM 
    statistics 
WHERE 
    name = "test" 
    AND $P{oneDayAgo} <= datetime 
    AND datetime <= $P{now} 
  • Cependant, étant donné que je n'ai une instruction SQL pour travailler avec, je dois les combiner en quelque sorte. J'ai essayé d'utiliser UNION (comme ci-dessous) mais cela n'a pas fonctionné.

Échec instruction SQL:

 
SELECT 
    SUM(count)as 'today' 
FROM 
    statistics 
WHERE 
    name = "test" 
AND $P{oneDayAgo} <= datetime 
AND datetime <= $P{now} 
UNION 
SELECT 
    SUM(count)as 'thisWeek' 
FROM 
    statistics 
WHERE 
    name = "test" 
AND $P{oneWeekAgo} <= datetime 
AND datetime <= $P{now} 
UNION 
SELECT 
    SUM(count)as 'thisMonth' 
FROM 
    statistics 
WHERE 
    name = "test" 
AND $P{oneMonthAgo} <= datetime 
AND datetime <= $P{now} 

(*), on peut ajouter des requêtes supplémentaires uniquement pour des graphiques ou des tableaux croisés, ni qui servent mon but.

+0

Si vous postez votre définition de table et l'exemple de votre sortie souhaitée, je suis sûr que quelqu'un peut vous aider .. – eschneider

Répondre

4

somme (cas où -condition- puis compter sinon 0 fin)

SELECT 
    SUM(case when $P{oneDayAgo} <= datetime then count else 0 end) as 'today', 
    SUM(case when $P{oneWeekAgo} <= datetime then count else 0 end) as 'thisweek', 
    SUM(count) as 'thismonth' 
FROM 
    statistics 
WHERE 
    name = "test" 
    AND $P{oneMonthAgo} <= datetime 
    AND datetime <= $P{now} 

Notez que si vous avez besoin des moyennes, assurez-vous de remplacer NULL pour 0.

+0

Les autres façons fonctionneront, mais c'est une meilleure approche ... – eschneider

+0

$ P {} - Est-ce que c'est de la magie de Jasper, ou une partie du langage SQL que je n'ai jamais vu auparavant? –

+0

$ P {} est la magie de Jasper! (Juste un paramètre spécifié dans le rapport) – barryred

0

Les requêtes UNION devraient produire les mêmes colonnes (nom, type). Définir des colonnes non utilisées à NULL ou utiliser une colonne Différenciation:

SELECT 
    SUM(count) as `total`, 
    'today' as `when` 
FROM 
    statistics 
WHERE 
    name = "test" 
AND $P{oneDayAgo} <= datetime 
AND datetime <= $P{now} 
UNION 
SELECT 
    SUM(count) as `total`, 
    'thisWeek' as `when` 
FROM 
    statistics 
WHERE 
    name = "test" 
AND $P{oneWeekAgo} <= datetime 
AND datetime <= $P{now} 
UNION 
SELECT 
    SUM(count) as `total`, 
    'thisMonth' as `when` 
FROM 
    statistics 
WHERE 
    name = "test" 
AND $P{oneMonthAgo} <= datetime 
AND datetime <= $P{now} 
+0

Alors, comment différencier les lignes 'jour' et 'mois' des lignes 'mois'? – barryred

+0

ajouté un exemple de code pour cela –

+0

Vous pouvez également utiliser CASE/WHEN pour calculer la colonne 'when', au lieu de UNION. –

0

Vous avez 2 options:

1) Retirez le « comme » une partie de chaque requête, puis il viendra comme une colonne qui n'aura pas un nom

2) Créez une table temporaire et insérez ces lignes dans une table temporaire puis interrogez la table temporaire

Questions connexes