[SQL]Problème de requête insert

Résolu
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 ? :)
Configuration: Windows XP
Firefox 1.5.0.7

2 réponses

  1. 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. 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...