Twitter iPhone pliant OnePlus 11 PS5 Disney+ Orange Livebox Windows 11

Requete T-SQL pour compléter des données manquantes

4 réponses
Avatar
Kerad
Bonjour,

Je cherche à alimenter un graphe Reporting Services.
Les données en abscisse sont une date, et les données en ordonnées des
entiers.

Ma requete retourne
Select jour, count(*) as nombreEntrees
From entrees
GROUP BY jour

j'aurais donc des données retournées de ce style
01/03/2006 5
03/03/2006 8
07/03/2006 9

Il n'y a pas d'entrée chaque jour, et je voudrais sur le graphe avoir une
representation de la forme:
01/03/2006 5
02/03/2006 0
03/03/2006 8
04/03/2006 0
05/03/2006 0
06/03/2006 0
07/03/2006 9

je voudrais donc que ma vue me retourne les dates manquantes entre la date
minimum et la date maximum, sans qu'elles existent dans la table.
Commetn faire ceci, je me disais que peut être en passant par une table
temporaire, mais je ne sais pas générer son contenu.

Merci de votre aide

4 réponses

Avatar
Christian Robert
Solution avoir une table de contenant les dates, au pire une table
temporaire...

SELECT jour, count(*) as nombreEntrees
FROM #mesdates AS dte
LEFT JOIN entrees AS ent ON dte.jour = ent.jour
GROUP BY jour

Où mesdates est une table

Pour l'alimenter un script :

DECLARE @datedepart datetime
DECLARE @datearrivee datetime

-- Récupère la date du jour et enlève la composante heure
SET @datedepart = CONVERT(datetime, CONVERT(varchar(10), GETDATE(), 112), 112)

SET @datedepart = DATEADD(month, -1, @datedepart )
SET @datearrivee = DATEADD(month, 2, @datedepart )


WHILE (@datedepart < @datearrivee)
BEGIN

INSERT INTO mesdates VALUES( @datedepart)
SET @datedepart = DATEADD(day, 1, @datedepart )

END

Ce qui génère les dates d'un mois avant et après la date du jour

--
Cordialement

Christian Robert
Consultant - Formateur chez Winwise
MCT - MCDBA - MCSD


"Kerad" a écrit :

Bonjour,

Je cherche à alimenter un graphe Reporting Services.
Les données en abscisse sont une date, et les données en ordonnées des
entiers.

Ma requete retourne
Select jour, count(*) as nombreEntrees
From entrees
GROUP BY jour

j'aurais donc des données retournées de ce style
01/03/2006 5
03/03/2006 8
07/03/2006 9

Il n'y a pas d'entrée chaque jour, et je voudrais sur le graphe avoir une
representation de la forme:
01/03/2006 5
02/03/2006 0
03/03/2006 8
04/03/2006 0
05/03/2006 0
06/03/2006 0
07/03/2006 9

je voudrais donc que ma vue me retourne les dates manquantes entre la date
minimum et la date maximum, sans qu'elles existent dans la table.
Commetn faire ceci, je me disais que peut être en passant par une table
temporaire, mais je ne sais pas générer son contenu.

Merci de votre aide


Avatar
Kerad
Merci beaucoup.

"Christian Robert" a écrit :

Solution avoir une table de contenant les dates, au pire une table
temporaire...

SELECT jour, count(*) as nombreEntrees
FROM #mesdates AS dte
LEFT JOIN entrees AS ent ON dte.jour = ent.jour
GROUP BY jour

Où mesdates est une table

Pour l'alimenter un script :

DECLARE @datedepart datetime
DECLARE @datearrivee datetime

-- Récupère la date du jour et enlève la composante heure
SET @datedepart = CONVERT(datetime, CONVERT(varchar(10), GETDATE(), 112), 112)

SET @datedepart = DATEADD(month, -1, @datedepart )
SET @datearrivee = DATEADD(month, 2, @datedepart )


WHILE (@datedepart < @datearrivee)
BEGIN

INSERT INTO mesdates VALUES( @datedepart)
SET @datedepart = DATEADD(day, 1, @datedepart )

END

Ce qui génère les dates d'un mois avant et après la date du jour

--
Cordialement

Christian Robert
Consultant - Formateur chez Winwise
MCT - MCDBA - MCSD


"Kerad" a écrit :

> Bonjour,
>
> Je cherche à alimenter un graphe Reporting Services.
> Les données en abscisse sont une date, et les données en ordonnées des
> entiers.
>
> Ma requete retourne
> Select jour, count(*) as nombreEntrees
> From entrees
> GROUP BY jour
>
> j'aurais donc des données retournées de ce style
> 01/03/2006 5
> 03/03/2006 8
> 07/03/2006 9
>
> Il n'y a pas d'entrée chaque jour, et je voudrais sur le graphe avoir une
> representation de la forme:
> 01/03/2006 5
> 02/03/2006 0
> 03/03/2006 8
> 04/03/2006 0
> 05/03/2006 0
> 06/03/2006 0
> 07/03/2006 9
>
> je voudrais donc que ma vue me retourne les dates manquantes entre la date
> minimum et la date maximum, sans qu'elles existent dans la table.
> Commetn faire ceci, je me disais que peut être en passant par une table
> temporaire, mais je ne sais pas générer son contenu.
>
> Merci de votre aide


Avatar
SQLpro [MVP]
Kerad a écrit :
Bonjour,

Je cherche à alimenter un graphe Reporting Services.
Les données en abscisse sont une date, et les données en ordonnées des
entiers.

Ma requete retourne
Select jour, count(*) as nombreEntrees
From entrees
GROUP BY jour

j'aurais donc des données retournées de ce style
01/03/2006 5
03/03/2006 8
07/03/2006 9

Il n'y a pas d'entrée chaque jour, et je voudrais sur le graphe avoir une
representation de la forme:
01/03/2006 5
02/03/2006 0
03/03/2006 8
04/03/2006 0
05/03/2006 0
06/03/2006 0
07/03/2006 9

je voudrais donc que ma vue me retourne les dates manquantes entre la date
minimum et la date maximum, sans qu'elles existent dans la table.
Commetn faire ceci, je me disais que peut être en passant par une table
temporaire, mais je ne sais pas générer son contenu.




SQL ne saurait inventer des données. Vous DEVEZ implanter une table des
dates dans ce cas. Votre modèle est en défaut.
Après vous n'aurez qu'à faire une jointure RIGHT OUTER JOIN avec cette
table de date et le tour sera joué

Lisez l'article que j'ai écrit à ce sujet :
http://sqlpro.developpez.com/cours/gestiontemps/

A +


Merci de votre aide




--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************
Avatar
Kerad
malheureusement ce n'est pas mon modèle mais celui d'un produit de Microsoft ;)
le problème se repète aussi dans le cas d'entiers à la place des dates...
La solution de la table intermédiaire dans la vue y répond

"SQLpro [MVP]" a écrit :

Kerad a écrit :
> Bonjour,
>
> Je cherche à alimenter un graphe Reporting Services.
> Les données en abscisse sont une date, et les données en ordonnées des
> entiers.
>
> Ma requete retourne
> Select jour, count(*) as nombreEntrees
> From entrees
> GROUP BY jour
>
> j'aurais donc des données retournées de ce style
> 01/03/2006 5
> 03/03/2006 8
> 07/03/2006 9
>
> Il n'y a pas d'entrée chaque jour, et je voudrais sur le graphe avoir une
> representation de la forme:
> 01/03/2006 5
> 02/03/2006 0
> 03/03/2006 8
> 04/03/2006 0
> 05/03/2006 0
> 06/03/2006 0
> 07/03/2006 9
>
> je voudrais donc que ma vue me retourne les dates manquantes entre la date
> minimum et la date maximum, sans qu'elles existent dans la table.
> Commetn faire ceci, je me disais que peut être en passant par une table
> temporaire, mais je ne sais pas générer son contenu.


SQL ne saurait inventer des données. Vous DEVEZ implanter une table des
dates dans ce cas. Votre modèle est en défaut.
Après vous n'aurez qu'à faire une jointure RIGHT OUTER JOIN avec cette
table de date et le tour sera joué

Lisez l'article que j'ai écrit à ce sujet :
http://sqlpro.developpez.com/cours/gestiontemps/

A +

>
> Merci de votre aide


--
Frédéric BROUARD, MVP SQL Server, expert bases de données et langage SQL
Le site sur le langage SQL et les SGBDR : http://sqlpro.developpez.com
Audit, conseil, expertise, formation, modélisation, tuning, optimisation
********************* http://www.datasapiens.com ***********************