2010-11-15 7 views
0

J'ai un ensemble de données qui compte le nombre de palettes produites par heure, par exempleSSRS graphique linéaire: axe x échelle de temps des lacunes dans les données

11/11/2010 22:00 -> 22
11/11/2010 23:00 -> 12
11/12/2010 00:00 -> 18
11/12/2010 01:00 -> 19
11/12/2010 03:00 -> 20

Comme vous pouvez le constater, il existe un écart entre 01:00 et 03:00 car il n'y a pas de données pour cette heure. Ces données sont visualisées dans SSRS 2005 en utilisant un graphique avec un axe des abscisses à l'échelle du temps. Lorsque le type de graphe est 'Colonne', il n'y a aucun problème puisque 02:00 est visualisé sans valeur (0) et l'écart est bien visible dans le graphe. Lorsque le type de graphe est 'Line' ou 'Area', 02:00 est également visualisé sur le graphe mais sans valeur 0: il y a une ligne de connexion entre la valeur 01:00 et 03:00. Lorsque l'on regarde le graphique linéaire, on peut conclure qu'il y avait production à 02:00 mais ce n'est pas vrai, c'est juste la ligne qui relie la valeur de 01:00 à la valeur de 03:00.

Exemple des mêmes données dans un graphe de zone alt text (image originale: http://img577.imageshack.us/img577/9616/area.jpg)

et un graphique de colonne alt text (image originale: http://img577.imageshack.us/img577/7590/column.jpg)

devrait expliquer le problème.

Est-ce que quelqu'un sait comment résoudre ce problème? Je vous remercie!

+0

signalez-vous d'une source de données SQL, et si oui, quelle version de SQL - Oracle, SQLServer, MySQL, etc? –

Répondre

3

Probablement, vous avez trouvé une réponse à votre question maintenant. Ceci est pour d'autres qui pourraient trébucher sur cette question. Cette solution n'est applicable que si vous utilisez SQL Server 2005 or above comme source de données pour les rapports. L'exemple utilise Common Table Expressions (CTE) pour obtenir les résultats souhaités mentionnés dans la question. L'exemple mentionné ci-dessous utilise la base de données SSRS 2005 et SQL Server 2008 R2. Les CTE sont pris en charge dans SQL Server 2005 or above.

processus étape par étape:

  1. Créer une table nommée dbo.TimeScaleData et remplir avec les données fournies dans la question. Reportez-vous à la capture d'écran # . Créer des scripts de la table est fourni sous la section SQL Scripts.

  2. Créez un CTE qui prendra les valeurs de date minimum et maximum dans le tableau dbo.TimeScaleData et générera toutes les valeurs de temps pour chaque heure comprise entre la plage donnée. Ensuite, utilisez OUTER APPLY entre le CTE et la table dbo.TimeScaleData pour récupérer les données. Toute plage de temps qui n'a pas d'enregistrement correspondant recevra la valeur 0. Reportez-vous à la capture d'écran # . Cette requête sera utilisée dans le rapport SSRS pour créer l'ensemble de données. La requête est fournie section SSRS DataSet Query.

  3. La capture d'écran # indique que la requête CTE est utilisée pour créer l'ensemble de données du rapport. Captures d'écran # - # montre comment le contrôle Chart est configuré pour utiliser l'ensemble de données.

  4. Capture d'écran # affiche la sortie du rapport par rapport aux données dans la table SQL Server.

Espérons que ça aide.

Scripts SQL:

CREATE TABLE [dbo].[TimeScaleData](
    [Id] [int] IDENTITY(1,1) NOT NULL, 
    [DateTimeValue] [datetime] NULL, 
    [PalletsProduced] [int] NULL, 
CONSTRAINT [PK_TimeScaleData] PRIMARY KEY CLUSTERED ([Id] ASC)) ON [PRIMARY] 
GO 

DataSet SSRS Requête:

DECLARE @StartDateTime AS DATETIME; 
DECLARE @EndDateTime AS DATETIME; 

SELECT @StartDateTime = MIN(DateTimeValue) 
    , @EndDateTime = MAX(DateTimeValue) 
FROM dbo.TimeScaleData; 

WITH CTE(DateTimeRange) AS 
(
     SELECT @StartDateTime AS DateTimeRange 
    UNION ALL 
     SELECT DATEADD(HOUR, 1, DateTimeRange) 
     FROM CTE 
     WHERE DATEADD(HOUR, 1, DateTimeRange) <= @EndDateTime 
) 
SELECT   CTE.DateTimeRange 
      , COALESCE(TSD.PalletsProduced, 0) AS PalletsProduced 
FROM   CTE 
OUTER APPLY  (
        SELECT PalletsProduced 
        FROM dbo.TimeScaleData TSD 
        WHERE TSD.DateTimeValue = CTE.DateTimeRange 
       ) TSD; 

Screenshot # 1:

1

écran # 2:

2

écran # 3:

3

écran # 4:

4

écran # 5:

5

écran # 6:

6

écran # 7:

7

Capture d'écran # 8:

8

+0

J'avais trouvé une solution mais pas tout à fait la même que celle ci-dessus. Merci, je vais essayer de mettre en œuvre cela! –

Questions connexes