SSRS Grafico lineare: x-asse di scala con intervalli nei dati
-
10-10-2019 - |
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 (immagine originale: http://img577.imageshack.us/img577/9616/area.jpg )
ed una colonna grafico (immagine originale: http://img577.imageshack.us/img577/7590/column.jpg )
dovrebbe spiegare il problema.
Qualcuno sa come risolvere questo problema? Grazie!
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:
-
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 . -
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 utilizzareOUTER APPLY
tra il CTE e ladbo.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 . -
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
-
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:
Cattura schermo # 2:
Screenshots # 3:
Cattura schermo # 4:
Cattura schermo # 5:
Cattura schermo # 6:
Cattura schermo # 7:
Cattura schermo # 8: