[SQL] requete: combler les "vides" dans une table avec des donnees

requete: combler les "vides" dans une table avec des donnees [SQL] - SQL/NoSQL - Programmation

Marsh Posté le 04-02-2011 à 03:54:51    

salut a tous
 
admettons que j'aie une table (date, nombre) avec admettons pour simplifier 1 entree maximum par date (mais possiblemenent 0)
 
je cherche a faire une query qui me retourne les 10 derniers jours sous forme couples (date, nombre) en comblant les trous
 
cad si aujourd'hui est le 03 fevrier et qu'il manque le 1er fevrier, j'aimerais que ma query retourne (je mets des 4 partout pour le nombre pour faciliter):
 
2011-02-03, 4
2011-02-02, 4
2011-02-01, 'NULL'
2011-01-31, 4
2011-01-30, 4
2011-01-29, 4
etc
 
 
est ce possible via une requete un peu rusee (postgresql) ?

Reply

Marsh Posté le 04-02-2011 à 03:54:51   

Reply

Marsh Posté le 04-02-2011 à 08:00:37    

Pourquoi le faire en sql? Il y a un langage appelant, en-dessous? Demander au sgbd de retourner des données vides n'a pas un intérêt fabuleux non?


---------------
Can't buy what I want because it's free -
Reply

Marsh Posté le 04-02-2011 à 08:42:03    

Avec SQL Server il y a moyen (le principe est probablement correct pour les autres SGBD aussi):
Faire un Left join avec une table contenant toutes les dates, ca te permettra de generer les trous.
 
La table avec toutes les dates peut etre generée a la volée (avec des comon table expression) si tu veux que tout tienne dans une seule query.
 
Voila ce que ca donne pour SQL Server:

Code :
  1. ;with cte10 (n) AS (
  2.     SELECT 1 union ALL SELECT 1 union ALL
  3.     SELECT 1 union ALL SELECT 1 union ALL
  4.     SELECT 1 union ALL SELECT 1 union ALL
  5.     SELECT 1 union ALL SELECT 1 union ALL
  6.     SELECT 1 union ALL SELECT 1
  7.     ),
  8.     cte100 (n) AS (SELECT 1 FROM cte10 a, cte10 b),
  9.     cte10k (n) AS (SELECT 1 FROM cte100 a, cte100 b),
  10.     cte100m (dte) AS (SELECT top 50000 CONVERT(datetime,ROW_NUMBER() OVER (ORDER BY a.n) - 1) FROM cte10k a, cte10k b)
  11. SELECT a.dte, b.nombre
  12. FROM cte100m a
  13.     LEFT JOIN @tmpTable b ON b.date = a.dte
  14. WHERE a.dte BETWEEN '2011-01-29' AND '2011-02-03'


 
Résultats:
dte nombre
2011-01-29 00:00:00.000 4
2011-01-30 00:00:00.000 4
2011-01-31 00:00:00.000 4
2011-02-01 00:00:00.000 NULL
2011-02-02 00:00:00.000 4
2011-02-03 00:00:00.000 4


Message édité par Oliiii le 04-02-2011 à 08:42:27
Reply

Marsh Posté le 04-02-2011 à 18:00:44    

>skeye
 
oui tu as probablement raison, ca serait plus propre
 
>Oliii
 
j'ai pense au outer join mais bon... c'est pas super elegant :)

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed