IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Développement SQL Server Discussion :

Calculer un produit selon si il est en dessous ou au dessus d'un seuil


Sujet :

Développement SQL Server

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de jubourbon
    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 540
    Par défaut Calculer un produit selon si il est en dessous ou au dessus d'un seuil
    Bonjour à tous,

    Je développe une base de donnée pour calculer le cout d'un travail selon un contrat.
    Pour faire simple, j'ai un contrat qui défini le cout des travaux de façon unitaire. Pour une quantité donnée, ces travaux ont un cout net, au dessus de cette quantité, ils sont majorés.

    Par exemple:
    Un contrat spécifie qu'il est prévu 5 jours de travaux. Chacun de ces jours coutera 10 euros, au delà ils couteront 20 euros.
    Donc si la somme des travaux réalisés est égale à 6 on aura 5x10 +1x20

    Voila ce que j'aimerai faire avec une requête. Mais je ne vois pas comment m'y prendre.

    Voici les sources de mes tables ainsi qu'un jeux de test:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
     
    CREATE TABLE [dbo].[Contrat2](
    	[idContrat] [int] NOT NULL,
    	[CoutNormal] [float] NULL,
    	[CoutSUpplementaire] [float] NULL,
    	[QuantiteInitiale] [int] NULL,
     CONSTRAINT [PK_Contrat2] PRIMARY KEY ([idContrat])
    ) 
     
    INSERT [dbo].[Contrat2] ([idContrat], [CoutNormal], [CoutSUpplementaire], [QuantiteInitiale]) VALUES (1, 10, 15, 5)
     
    CREATE TABLE [dbo].[Travaux2](
    	[IDTravaux] [int] NOT NULL,
    	[DateTrav] [date] NULL,
    	[CoutTravaux] [float] NULL,
    	[IDContrat] [int] NOT NULL,
     CONSTRAINT [PK_Travaux2] PRIMARY KEY CLUSTERED([IDTravaux]),
     CONSTRAINT [FK_Travaux_Contrat2] FOREIGN KEY([IDContrat]) REFERENCES [dbo].[Contrat] ([idContrat])
     )
     
    INSERT [dbo].[Travaux2] ([IDTravaux], [DateTrav], [CoutTravaux], [IDContrat]) VALUES (1, CAST(0x75330B00 AS Date), 3, 1)
    INSERT [dbo].[Travaux2] ([IDTravaux], [DateTrav], [CoutTravaux], [IDContrat]) VALUES (2, CAST(0x76330B00 AS Date), 3, 1)
    Si quelqu'un peut m'indiquer une piste, merci d'avance.

  2. #2
    Membre éclairé Avatar de jubourbon
    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 540
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
     
    select 
    YEAR(dbo.Travaux.DateTrav) AS Annee,
    MONTH(dbo.Travaux.DateTrav) AS I_Mois, 
    dbo.Contrat.idContrat AS IDContrat,
     'Cout' = case 
    WHEN SUM(travaux.CoutTravaux)<=Contrat.QuantiteInitiale THEN SUM(dbo.Contrat.CoutNormal * dbo.Travaux.CoutTravaux)
    ELSE (SUM(dbo.Contrat.CoutSUpplementaire * dbo.Travaux.CoutTravaux))
    END
    FROM Contrat INNER JOIN Travaux ON dbo.contrat.idContrat = dbo.Travaux.IDContrat
    Group by
    YEAR(dbo.Travaux.DateTrav),
    MONTH(dbo.Travaux.DateTrav), 
    dbo.Contrat.idContrat,
    Contrat.QuantiteInitiale
    Voila lrequete que j'ai faite, mais le probleme c'est que c'est soit normal soit supplementaire, et je voudrais faire
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SUM(dbo.Contrat.CoutNormal * dbo.Travaux.CoutTravaux)
    jusqu'a Contrat.QuantiteInitiale et au dela
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    (SUM(dbo.Contrat.CoutSUpplementaire * dbo.Travaux.CoutTravaux)

  3. #3
    Membre éclairé Avatar de jubourbon
    Homme Profil pro
    Inscrit en
    Octobre 2008
    Messages
    540
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations forums :
    Inscription : Octobre 2008
    Messages : 540
    Par défaut
    Je pense avoir trouvé une solution:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
    select 
    YEAR(dbo.Travaux.DateTrav) AS Annee,
    MONTH(dbo.Travaux.DateTrav) AS I_Mois, 
    dbo.Contrat.idContrat AS IDContrat,
     'Cout' = case 
    WHEN SUM(travaux.CoutTravaux)<=Contrat.QuantiteInitiale THEN SUM(dbo.Contrat.CoutNormal * dbo.Travaux.CoutTravaux)
    ELSE (Contrat.QuantiteInitiale * Contrat.CoutNormal) + ((SUM(travaux.CoutTravaux)-Contrat.QuantiteInitiale) * Contrat.CoutSUpplementaire)
    END
    FROM Contrat INNER JOIN Travaux ON dbo.contrat.idContrat = dbo.Travaux.IDContrat
    Group by
    YEAR(dbo.Travaux.DateTrav),
    MONTH(dbo.Travaux.DateTrav), 
    dbo.Contrat.idContrat,
    Contrat.QuantiteInitiale,
    Contrat.CoutNormal,
    Contrat.CoutSUpplementaire

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Calcul de moyenne selon condition
    Par WeDgEMasTeR dans le forum Excel
    Réponses: 5
    Dernier message: 31/12/2007, 19h08
  2. Pb de calcul dans un état si champ est vide
    Par edonis dans le forum IHM
    Réponses: 4
    Dernier message: 02/11/2007, 19h33
  3. comment calculer l'âge selon date naissance
    Par walid_kerkoub dans le forum Delphi
    Réponses: 8
    Dernier message: 31/07/2007, 12h09
  4. comment calculer le produit de deux nombres en PHP
    Par batalich dans le forum Langage
    Réponses: 3
    Dernier message: 12/03/2007, 09h02
  5. Réponses: 4
    Dernier message: 04/09/2006, 12h41

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo