Précédent   Forum des professionnels en informatique > Bases de données > MS SQL-Server > Développement
Développement Forum d'entraide sur le Transact-SQL, le CLR, les procédures stockées, les triggers, les requêtes SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 27/12/2010, 10h47   #1
Candidat au titre de Membre du Club
 
Inscription : mars 2008
Messages : 50
Détails du profil
Informations forums :
Inscription : mars 2008
Messages : 50
Points : 12
Points : 12
Par défaut Obtenir une ligne de résultat dans tout les cas

Bonjour,

J'ai beau chercher je ne trouve pas comment obtenir un résultat si ma requête ne me renvois rien.

Problèmatique:
Dans le cas ou ma requête ne renvois rien il faudrait qu'elle me renvois une ligne "par défaut"

Requête actuelle:

Citation:
SELECT
Idx.IdxDateexp as 'Date',
round((sum(convert(float,Img.imgsize)) / sum(1)), 0) as 'Poids moyen en octets',
ISNULL( sum(1), 0) as 'Nombre de fichiers',
sum(convert(float,Img.imgsize)) as 'Volumétrie en octets'

FROM MABASE.[Images] Img
LEFT join MABASE.[IndexData] Idx ON Img.IdxId = Idx.IdxId
LEFT join MABASE.[NatureDoc] Nat ON Idx.NatId = Nat.NatId and Nat.NatName <> Nat.NatLib

and idxdateexp >=
CASE
WHEN Idx.IdxDateexp is null THEN 0
ELSE
dateadd(mm, -1, convert(datetime, '01'+right(convert(varchar, GETDATE(), 103), 8) + ' 00:00:00', 103))
END

group by Idx.IdxDateex
Je n'arrive pas à trouver comment obtenir une ligne avec des valeurs par défaut (ex: 0,0,0,0..) car dans tout les cas je dois avoir qu'une seule ligne de résultat.

Une idée ?

Merci par avance
Apo94 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/12/2010, 11h10   #2
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Bonjour,

Est-ce que vous voulez récupérer au moins une ligne, ou une ligne par date ? (car vous semblez grouper par date).

Quelle est votre version de SQL Server ?
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/12/2010, 11h43   #3
Candidat au titre de Membre du Club
 
Inscription : mars 2008
Messages : 50
Détails du profil
Informations forums :
Inscription : mars 2008
Messages : 50
Points : 12
Points : 12
En efet je cherche à récupérer une seule ligne car je groupe.

Je pense avoir trouvé une solution.

Faire un 'UNION' avec un select ayant des valeur defaut et qui contient une clause where not exist (count sur la requête précédente)

REQ1
UNINON
SELECT 0 as 'truc' etc..
where not exists (
select count(Idx.idxdateexp REQ1)


Il faut faut terminer et tester mais à priori ca sera bon, juste peut être plus long.

Je suis sous MSSQL 2005 pour info.
Apo94 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 27/12/2010, 12h23   #4
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Re,

En fait vous voulez afficher le volume de fichier par jour, pour tous les jours (même les jours ou il n'y a pas de fichier) ?

Je ne comprend pas bien votre "micmac" sur la date dans votre dernière jointure
Citation:
and idxdateexp >=
CASE
WHEN Idx.IdxDateexp is null THEN 0
Je suppose que vous chercher a "arrondir" les date au jour près pour le groupement...

A mon avis, vous devriez utiliser les CTE pour votre requete. Quelque chose dans ce genre (a tester...) :
Code sql :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
 
WITH dte(dteDebut, dteFin) AS (
	SELECT CAST(MIN(IdxDateexp) AS DATE) AS dteDebut, DATEADD(DAY,1,CAST(MIN(IdxDateexp) AS DATE)) AS dteFin
	FROM IndexData
	UNION ALL
	SELECT DATEADD(DAY, 1 ,dteDebut), DATEADD(DAY, 1, dteFin)
	FROM dte
	WHERE dte.dteDebut < (SELECT MAX(IdxDateexp) FROM IndexData)
	)
SELECT
dte.dteDebut AS 'Date',
COALESCE(round((sum(convert(float,Img.imgsize)) / sum(1)), 0), 0) AS 'Poids moyen en octets',
COALESCE(count(*), 0) AS 'Nombre de fichiers',
COALESCE(sum(convert(float,Img.imgsize)), 0) AS 'Volumétrie en octets'
FROM dte
LEFT OUTER JOIN MABASE.[IndexData] Idx ON Idx.idxdatexp BETWEEN dte.dteDebut AND dte.dteFin
INNER JOIN  MABASE.[Images] Img ON Img.IdxId = Idx.IdxId
LEFT JOIN MABASE.[NatureDoc] Nat ON Idx.NatId = Nat.NatId AND Nat.NatName <> Nat.NatLib
GROUP BY dte.dteDebut
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2011, 10h38   #5
Membre habitué
 
Avatar de grinder59
 
Inscription : septembre 2005
Messages : 514
Détails du profil
Informations forums :
Inscription : septembre 2005
Messages : 514
Points : 128
Points : 128
Par défaut même problème... et pas de solution

Bonjour,
je m'incruste dans la discussion car je rencontre le même souci avec cette requête :

Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
SELECT 
	maDate, 
	(SUM(maQuantite)/1000) AS maQuantite, 
	monParametre
FROM 
	dbo.maTable 
WHERE 
	(p1 = 'NA') AND 
	(NOT (p2 IS NULL)) AND 
	(CONVERT(varchar, maDate, 103) = CONVERT(varchar, GETDATE(), 103)) AND 
	CONVERT(INTEGER, p3) = 1 AND 
	monParametre = 2 
GROUP BY 
	maDate, 
	monParametre
Si je n'ai pas de données, je n'ai même pas 0 qui m'est renvoyé dans le champs maQuantite...
Auriez-vous un début de solution ? j'ai testé avec COLEASCE, ISNULL, CASE/WHEN mais sans résultat...

Merci de votre aide
grinder59 est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 02/02/2011, 12h06   #6
Rédacteur/Modérateur

 
Avatar de SQLpro
 
Homme Frédéric BROUARD
Expert SGBDR & SQL
Inscription : mai 2002
Messages : 10 950
Détails du profil
Informations personnelles :
Nom : Homme Frédéric BROUARD
Localisation : France

Informations professionnelles :
Activité : Expert SGBDR & SQL
Secteur : Conseil

Informations forums :
Inscription : mai 2002
Messages : 10 950
Points : 17 766
Points : 17 766
Vous avez eu un stocke de parenthèses à prix cassé pour en mettre autant ???

Code :
1
2
3
4
5
6
7
8
9
10
11
12
SELECT COALESCE(maDate, C1) 
	   COALESCE(SUM(maQuantite)/1000, C2) AS maQuantite, 
	   COALESCE(monParametre, C3)
FROM   dbo.maTable
       RIGHT OUTER JOIN (SELECT NULL AS C1, NULL AS C2, NULL AS C3)
             ON maDate = C1 
WHERE  p1 = 'NA' 
  AND  p2 IS NOT NULL
  AND  CONVERT(varchar, maDate, 103) = CONVERT(varchar, GETDATE(), 103)
  AND  CAST(p3 AS INT) = 1 
  AND  monParametre = 2 
GROUP  BY maDate, monParametre
A +
__________________
Frédéric Brouard - SQLpro - ARCHITECTE DE DONNÉES - expert SGBDR et langage SQL
Site sur les SGBD relationnels et le langage SQL: http://sqlpro.developpez.com/
Expert Microsoft SQL Server - M.V.P. (Most valuable Professional) MS Corp.
Blog SQL, SQL Server, modélisation données : http://blog.developpez.com/sqlpro
http://www.sqlspot.com : modélisation, conseils, audit, optimisation, formation
* * * * * Enseignant CNAM PACA - ISEN Toulon - CESI Aix en Provence * * * * *
SQLpro est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 09h54.


 
 
 
 
Partenaires

Hébergement Web