Posez votre question Signaler

[SQL]Problème de requête insert [Résolu]

Melaus 3Messages postés 31 janvier 2007Date d'inscription - Dernière réponse le 31 janv. 2007 à 14:25
Bonjour à toutes et à tous,
Je vais tenter d'expliquer mon petit problème du mieux possible.
Dans une base de données SQL se trouve 3 tables.
- Table statistique
- Table Host
- Table server
Je dois alimenter la table Statistique en debut de mois avec des infos de la table Host.
Voici un debut de requête
INSERT INTO StatGroup (GroupId, GroupName, NbrSecProd, Mois, Annee, SumDelay, SumIncident, MTBF, MTTF, Dispo)
SELECT  GroupId, GroupName, DATEDIFF(second,SUBSTRING(CONVERT(varchar(8), GETDATE(), 112), 1, 6) + '01', SUBSTRING (CONVERT(varchar(8), DATEADD(M, 1, GETDATE()), 112), 1, 6) + '01') AS NbrSecProd, DATEPART(M, GETDATE()) AS Mois, DATEPART (YYYY, GETDATE()) AS Annee, 0 AS SumDelay, 0 AS SumIncident, 0 AS MTBF, 0 AS MTTF, 100 AS Dispo
FROM ServerGroup

Le resultat est :
Id | Host | NbrSecProd | Mois | Annee | SumDelay | SumIncident | MTBF | MTTR | Dispo
1..|.host1|...2678400..|..1...|..2007.|..0.......|......0......|..0...|...0..|.100..
2..|.host2|...2678400..|..1...|..2007.|..0.......|......0......|..0...|...0..|.100..
3..|.host3|...2678400..|..1...|..2007.|..0.......|......0......|..0...|...0..|.100..
4..|.host4|...2678400..|..1...|..2007.|..0.......|......0......|..0...|...0..|.100..
5..|.host5|...2678400..|..1...|..2007.|..0.......|......0......|..0...|...0..|.100..
La colonne AS NbrSecProd doit être multiplié par le nombre de serveurs faisant parti du Host.
Pour les connaitres, j’utilise cette requête
SELECT     COUNT(*) AS Expr1
FROM Server INNER JOIN ServerGroup ON Server.GroupId = ServerGroup.GroupId
WHERE     (Server.OutProdState = 0)
GROUP BY Server.GroupId

Elle affiche
| Expr 1 |
|...28....|
|...2.....|
|...5.....|
|...6.....|
|...4.....|
|...21...|
|...6.....|
|...9.....|
|...2.....|
|...7.....|
|...28...|
|...13...|
|...16...|
|...31...|
|...13...|
Le soucis est que j’ai un peu de mal à ajouter le multiplicateur à ma requête INSERT.
Une âme charitable pourrait peut-etre m'eclairer ? :)
Lire la suite 

[SQL]Problème de requête insert »

2 réponses
Réponse
+1
moins plus
Bonjour,

Quel SGBD utilises-tu ?
Si tu es sous SQL Server, tu peux par exemple passer par une fonction :
CREATE  FUNCTION getDureeProd(@groupId int, @nbSec varchar(8))
RETURNS varchar(10)
AS
BEGIN
	DECLARE @nbServers int
	DECLARE @nbSecInt int

	SELECT @nbSecInt = CONVERT(int, @nbSec)
		
	SELECT @nbServers = count(*)
	FROM Server
	INNER JOIN ServerGroup
		ON Server.GroupId = ServerGroup.GroupId
	WHERE     (Server.OutProdState = 0)
	GROUP BY Server.GroupId

	RETURN Convert(varchar(10), @nbServers*@nbSecInt)
END
Je pense que tu peux en comprendre le principe assez simplement.
Ta requête SQL devient alors :
INSERT INTO StatGroup (GroupId, GroupName, NbrSecProd, Mois, Annee, SumDelay, SumIncident, MTBF, MTTF, Dispo)
	SELECT 
		GroupId, GroupName,
		getDureeProd(GroupId,
			DATEDIFF(second,SUBSTRING(CONVERT(varchar(8), GETDATE(), 112), 1, 6) + '01', SUBSTRING (CONVERT(varchar(8), DATEADD(M, 1, GETDATE()), 112), 1, 6) + '01'))
		AS NbrSecProd,
		DATEPART(M, GETDATE()) AS Mois, DATEPART (YYYY, GETDATE()) AS Annee, 0 AS SumDelay, 0 AS SumIncident, 0 AS MTBF, 0 AS MTTF, 100 AS Dispo
	FROM ServerGroup
Par contre, si ton SGBD ne supporte pas les fonctions (ou autre choses équivalentes), tu peux tenter une vue, qui te donne d'un côté le groupID, de l'autre le nombre de serveurs, et faire une jointure sur la vue en question...
Ajouter un commentaire
Réponse
+1
moins plus
Merci bcp pour ton aide Reivax, mais j'ai finis par trouver une solution qui fonctionne.
Je suis sur SQL Server et je n'ai que de vagues notions (les fonctions de bases).
J'ai tenté ta solution mais le resultat de NbrSecProd etait tjs le même pour tous les Host (mêmes ceux n'ayant aucun serveur). Donc je pense que je n'ai pas vraiment tout capté de ta solution. ^^

Au final j'ai reussi à faire ça :
INSERT INTO StatGroup
                      (GroupId, GroupName, NbrSecProd, Mois, Annee, SumDelay, SumIncident, MTBF, MTTF, Dispo)
SELECT     ServerGroup.GroupId, ServerGroup.GroupName, DATEDIFF(second, SUBSTRING(CONVERT(varchar(8), GETDATE(), 112), 1, 6) + '01', 
                      SUBSTRING(CONVERT(varchar(8), DATEADD(M, 1, GETDATE()), 112), 1, 6) + '01') * COUNT(Server.GroupId) AS NbrSecProd, DATEPART(M, GETDATE()) 
                      AS Mois, DATEPART(YYYY, GETDATE()) AS Annee, 0 AS SumDelay, 0 AS SumIncident, 0 AS MTBF, 0 AS MTTF, 100 AS Dispo
FROM         ServerGroup INNER JOIN
                      Server ON ServerGroup.GroupId = Server.GroupId
WHERE     (Server.OutProdState = 0)
GROUP BY ServerGroup.GroupId, ServerGroup.GroupName


Elle tient en une requête et fait exactement ce que je voulais obtenir. Je vais ainsi pouvoir la placer dans une fonction d'une page asp. :)
Ajouter un commentaire
Ce document intitulé « [SQL]Problème de requête insert » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Dossier à la une
Passage au tout numérique : quel coût pour les particuliers ?