[SQL]Problème de requête insert

Résolu/Fermé
Melaus Messages postés 3 Date d'inscription mercredi 31 janvier 2007 Statut Membre Dernière intervention 6 février 2007 - 31 janv. 2007 à 10:50
Melaus Messages postés 3 Date d'inscription mercredi 31 janvier 2007 Statut Membre Dernière intervention 6 février 2007 - 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 ? :)

2 réponses

Reivax962 Messages postés 3671 Date d'inscription jeudi 16 juin 2005 Statut Membre Dernière intervention 11 février 2021 1 011
31 janv. 2007 à 12:26
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...
1
Melaus Messages postés 3 Date d'inscription mercredi 31 janvier 2007 Statut Membre Dernière intervention 6 février 2007 1
31 janv. 2007 à 14:25
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. :)
1