Précédent   Forum des professionnels en informatique > Bases de données > Langage SQL
Langage SQL Forum d'entraide sur le langage SQL et sur les questions liées à la conception de schéma (DDL). Cours SQL
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 30/05/2011, 09h37   #1
Invité régulier
 
Inscription : décembre 2010
Messages : 36
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 36
Points : 7
Points : 7
Par défaut Requête SQL IIF et SUM

Bonjour à tous,

J'ai une table 'trade' qui contient des ordres (achat/vente) dont la différence se note au niveau de la colonne quantité (Achat = Quantité > 0 et Vente = Quantité < 0)
Pas très compliqué.

Ce que je voudrais faire c'est une requete qui me dise la volumétrie journalière des achats et des ventes distinctes.

C'est possible ?

Voici ma tentative :

Code :
1
2
3
4
5
6
SELECT iif(tr.quantity > 0 , sum(tr.trade_price * tr.quantity) AS ACHAT, sum(tr.trade_price * tr.quantity) AS VENTE )
FROM trade tr
WHERE tr.trade_date_time >= to_date ('01122008','ddmmyyyy')
AND   tr.trade_date_time <= to_date ('01012009','ddmmyyyy')
ORDER BY tr.trade_date_time
GROUP BY tr.trade_date_time
F.Salenko est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/05/2011, 10h41   #2
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Bonjour,

Que donne ceci :

Code SQL :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
SELECT 
    SUM(IIF(
        tr.quantity > 0 , 
        tr.trade_price * tr.quantity,
        0
    ) AS ACHAT, 
    - SUM(IIF(
        tr.quantity > 0 , 
        0,
        tr.trade_price * tr.quantity
    ) AS VENTE 
FROM trade tr
WHERE tr.trade_date_time >= to_date ('01122008','ddmmyyyy')
AND   tr.trade_date_time <= to_date ('01012009','ddmmyyyy')
ORDER BY tr.trade_date_time
GROUP BY tr.trade_date_time
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/05/2011, 11h07   #3
Modérateur
 
Homme Fabien
Ingénieur d'études en décisionnel
Inscription : septembre 2008
Messages : 5 684
Détails du profil
Informations personnelles :
Nom : Homme Fabien
Âge : 34
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Ingénieur d'études en décisionnel
Secteur : Arts - Culture

Informations forums :
Inscription : septembre 2008
Messages : 5 684
Points : 10 434
Points : 10 434
Envoyer un message via ICQ à Waldar Envoyer un message via Skype™ à Waldar
GROUP BY est à placer avant le ORDER BY.
La syntaxe du IIF, je ne la connais pas, mais êtes-vous sûr que votre SGBD ne supporte pas la fonction normative CASE WHEN THEN ELSE END ?
__________________
Email : http://scr.im/waldar
Waldar est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/05/2011, 11h11   #4
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
Bien vu pour le GROUP BY/ORDER BY
Je n'avais pas lu la requête jusqu'au bout

Le IIF m'a fait supposé qu'il s'agissait d'ACCESS lequel (me semble-t-il) ne connais pas le CASE WHEN...

Cela dit en effet, s'il ne s'agit pas d'Access, un CASE serait bien mieux !
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/05/2011, 13h33   #5
Invité régulier
 
Inscription : décembre 2010
Messages : 36
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 36
Points : 7
Points : 7
Je suis sous Oracle 10g

Je crois que les IIF ne sont pas reconnus ou alors je ne sais pas m'en servir car lorsque je retape la requete de aieeeeuuuuuuu, j'obtiens une erreur "missing right parenthesis" or il ne manque rien du tout...

Je vais partir sur un Case pour voir ce que cela donne !
F.Salenko est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 30/05/2011, 13h55   #6
Membre Expert
 
Inscription : janvier 2010
Messages : 1 084
Détails du profil
Informations personnelles :
Localisation : France, Rhône (Rhône Alpes)

Informations forums :
Inscription : janvier 2010
Messages : 1 084
Points : 1 573
Points : 1 573
en effet, tout remis dans l'ordre et avec un case et avec la colonne tr.trade_date_time spécfiée dans le select cela donne

Code SQL :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
 
SELECT 
    tr.trade_date_time,
    SUM(
        CASE WHEN tr.quantity > 0 
            THEN tr.trade_price * tr.quantity
            ELSE 0
        END
    ) AS ACHAT, 
    - SUM(
        CASE WHEN tr.quantity > 0 
            THEN 0
            ELSE tr.trade_price * tr.quantity
        END
    ) AS VENTE 
FROM trade tr
WHERE tr.trade_date_time >= to_date ('01122008','ddmmyyyy')
AND   tr.trade_date_time <= to_date ('01012009','ddmmyyyy')
GROUP BY tr.trade_date_time
ORDER BY tr.trade_date_time
aieeeuuuuu est déconnecté   Envoyer un message privé Réponse avec citation 10
Vieux 30/05/2011, 17h40   #7
Invité régulier
 
Inscription : décembre 2010
Messages : 36
Détails du profil
Informations forums :
Inscription : décembre 2010
Messages : 36
Points : 7
Points : 7
merci pour ton aieu.

Ca m'a été vraiment vraiment utile
F.Salenko est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 17h12.


 
 
 
 
Partenaires

Hébergement Web