2010-10-04 2 views
3

J'essaie de regrouper mes données en fonction de l'âge. J'utilise la base de données suivante:Afficher un groupe sans données dans Crystal Reports 12

select * from (
select 0 range_start, 11 range_end, '0-10 days' date_description from dual union 
select 11, 21, '11-20 days' from dual union 
select 21, 31, '21-30 days' from dual union 
select 31, 99999, '31+ days' from dual) date_helper 
left outer join table 
on table.date <= date_helper.range_start*-1 + sysdate 
and table.date > date_helper.range_end*-1 + sysdate 

Je crée ensuite un groupe basé sur la colonne date_description. J'essaie de faire afficher tous les groupes, même s'il n'y a pas d'enregistrements, qui appartiennent à ce groupe. S'il n'y a aucun enregistrement, je veux qu'il ait une valeur de 0 et imprime toujours le groupe.

Répondre

0

Développant un commentaire sur la réponse de PowerUser, si vous utilisez une version de Crystal qui vous permet d'entrer votre propre SQL (au lieu d'avoir à utiliser l'expert de la base de données Crystal), vous pouvez mettre en place une sous-requête qui agit comme une table d'assistance - quelque chose comme:

select * from (
select 0 range_start, 11 range_end, '0-10 days' date_description from dual union 
select 11, 21, '11-20 days' from dual union 
select 21, 31, '21-30 days' from dual union 
select 31, 99999, '31+ days' from dual) date_helper 
left outer join 
(select sysdate-5 mydate from dual union all 
select sysdate - 25 from dual) mytable 
on mytable.mydate <= date_helper.range_start*-1 + sysdate 
and mytable.mydate > date_helper.range_end*-1 + sysdate 

(syntaxe Oracle - la syntaxe précise de la requête varie en fonction du dialecte SQL que vous utilisez.)

EDIT: modification de la syntaxe SQLServer vers Oracle.

AUTRE EDIT: Ajout de quelques exemples de données simples.

+0

Cela a fonctionné!, Je ne m'en suis pas rendu compte parce que je devais modifier mon choix, etc. Merci beaucoup !!! – ntsue

2

(+1 pour l'intégralité de votre question. Bienvenue à SO!)

S'il n'y a pas de dossiers pour un groupe, alors il est évident cristal ne peut pas le signaler. Je recommande de créer une table "helper" dans votre source de données. Voici ce que je ferais en utilisant une forme de SQL:

  1. Créer une table 'auxiliaire'. Il aura 1 colonne et contiendra tous les groupes que vous voulez afficher. Si les noms des groupes sont dynamiques, vous pouvez utiliser une requête select ou une requête de création de table.

  2. Faites une jointure à droite de votre table d'aide vers votre table de données. Envoyez les données combinées à Crystal.

  3. Dans Crystal, utilisez la colonne de la table auxiliaire dans vos calculs de regroupements et d'agebucket.

En outre, dans votre calcul, vous devez ajouter une ligne: Else "No age";

+0

Salut PowerUser, Merci pour votre réponse. Est-il possible de réaliser ce que je veux sans faire de changements sur le serveur? Merci encore! – ntsue

+1

@ntsue, si vous utilisez une version de Crystal qui vous permet d'entrer votre propre SQL (au lieu de devoir utiliser Crystal Database Expert), vous pouvez configurer une sous-requête qui agit comme une table auxiliaire - quelque chose comme ... 'de (sélectionner 0 début, 10 fin, '0-10 jours' date_description union sélectionner 11, 20, '11 -20 jours 'union sélectionner 21, 30, '21 -30 jours' union sélectionner 31, 99999, '31 + days ') date_helper, '... –

+0

@Mark: Bonne idée. Pouvez-vous travailler cela dans une réponse complète? J'essaie de le faire moi-même et je continue d'obtenir des erreurs de compilation SQL. – PowerUser