Domanda

Ho un insieme di dati che conta il numero di pallet prodotte per ora, ad esempio

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

Come si può notare, c'è un divario 1:00-3:00 poiché non ci sono dati per quell'ora. Questi dati viene visualizzato in SSRS 2005, utilizzando un grafico con una scala temporale dell'asse x. Quando il tipo di grafo è 'Colonna', non v'è alcun problema poiché 02:00 viene visualizzato senza (0) valore e il divario è ben visibile nel grafico. Quando il tipo di grafo è 'linea' o 'Area', 2:00 viene visualizzata sul grafico nonché ma senza valore 0: v'è una linea di collegamento tra il valore di 01:00 e 03:00. Quando si cerca di grafico a linee, si potrebbe concludere che non vi era la produzione alle 02:00, ma questo non è vero, è solo la linea che collega il valore di 01:00 con il valore di 03:00.

Esempio degli stessi dati in una zona grafico alt text (immagine originale: http://img577.imageshack.us/img577/9616/area.jpg )

ed una colonna grafico alt text (immagine originale: http://img577.imageshack.us/img577/7590/column.jpg )

dovrebbe spiegare il problema.

Qualcuno sa come risolvere questo problema? Grazie!

È stato utile?

Soluzione

Probabilmente, avete trovato una risposta alla tua domanda ora. Questo è per gli altri che potrebbero inciampare su questa domanda. Questa soluzione è applicabile solo se si utilizza SQL Server 2005 or above come origine dati per i report. Gli usi di esempio Common Table Expressions (CTE) per ottenere i risultati desiderati citati nell'interrogazione. L'esempio citato di seguito usi SSRS 2005 e il database SQL Server 2008 R2. CTE sono supportati in SQL Server 2005 or above.

Step-by-step processo:

  1. Creare una tabella denominata dbo.TimeScaleData e popolare con i dati forniti nella domanda. Fare riferimento screenshot # 1 . Di creare script della tabella viene fornito in Script SQL .

  2. Crea un CTE che prenderà il valore massimo data minima e nella dbo.TimeScaleData tavolo e generare tutti i valori di tempo per ogni ora tra la gamma data. Quindi utilizzare OUTER APPLY tra il CTE e la dbo.TimeScaleData tabella per recuperare i dati. Ogni intervallo di tempo che non dispone di un record corrispondente verrà assegnato il valore 0. Fare riferimento screenshot # 2 . Questa query saranno utilizzati nella SSRS rapporto per creare il set di dati. La query viene fornito SSRS DataSet Query .

  3. Cattura schermo # 3 mostra che la query CTE viene utilizzato per creare il set di dati del report. Screenshots # 4 -. # 7 mostra come il controllo Chart è configurato per utilizzare il set di dati

  4. Cattura schermo # 8 mostra l'output del report contro i dati nella tabella di SQL Server.

La speranza che aiuta.

Script 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

SSRS DataSet query:

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;

Screenshots # 1:

1

Cattura schermo # 2:

2

Screenshots # 3:

3

Cattura schermo # 4:

4

Cattura schermo # 5:

5

Cattura schermo # 6:

6

Cattura schermo # 7:

7

Cattura schermo # 8:

8

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top