[SQL]Problème de requête insert

Résolu
Melaus Messages postés 3 Statut Membre -  
Melaus Messages postés 3 Statut Membre -
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. Reivax962 Messages postés 3742 Statut Membre 1 011
     
    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
  2. Melaus Messages postés 3 Statut Membre 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