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

Langage SQL Discussion :

Problème de définition d'une clause WHERE


Sujet :

Langage SQL

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre éclairé Avatar de Nerva
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    413
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 413
    Par défaut Problème de définition d'une clause WHERE
    Bonjour.

    Je n'arrive pas à définir une clause WHERE (enfin je pense que le problème vient de là) pour filtrer un identifiant. Il s'agit d'achat et de vente de produits dans une base (ici simplifiée).

    Structure et un jeu de données :

    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
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
    166
    167
    168
    169
    170
    171
    172
    173
    174
    175
    176
    177
    178
    179
    180
    181
    182
    183
    184
    185
    186
    187
    188
    189
    190
    191
    192
    193
    194
    195
    CREATE TABLE T_PRODUITS (
    	PRO_ID INTEGER IDENTITY NOT NULL,
    	FOU_ID INTEGER NOT NULL,
    	PRO_LIB VARCHAR (32) NOT NULL,
    	PRO_PUHT_ACH DECIMAL (8,2) NOT NULL,
    	PRO_PUHT_VEN DECIMAL (8,2) NOT NULL,
    	CONSTRAINT PK_PRO_ID PRIMARY KEY (PRO_ID)
    );
     
    CREATE TABLE TR_CALENDRIER (
    	CAL_DATE DATE NOT NULL,
    	CONSTRAINT PK_CAL_DATE PRIMARY KEY (CAL_DATE)
    );
     
    CREATE TABLE T_ACHATS (
    	ACH_ID INTEGER IDENTITY NOT NULL,
    	ACH_DATE DATE NOT NULL,
    	FOU_ID INTEGER NOT NULL,
    	ACH_TYPE TINYINT DEFAULT 2 NOT NULL,
    	CONSTRAINT PK_ACH_ID PRIMARY KEY (ACH_ID),
    	CONSTRAINT FK_ACH_CAL FOREIGN KEY (ACH_DATE) REFERENCES TR_CALENDRIER (CAL_DATE),
    	CONSTRAINT CK_ACH_TYPE CHECK (ACH_TYPE BETWEEN 1 AND 2)
    );
     
    CREATE TABLE T_ACHATS_SUB (
    	ACH_ID INTEGER NOT NULL,
    	PRO_ID INTEGER NOT NULL,
    	ACH_PUHT DECIMAL (8,2) NOT NULL,
    	ACH_QTE INTEGER NOT NULL,
    	CONSTRAINT PK_ACH_PRO PRIMARY KEY (ACH_ID, PRO_ID),
    	CONSTRAINT FK_ACH_ID FOREIGN KEY (ACH_ID) REFERENCES T_ACHATS (ACH_ID),
    	CONSTRAINT FK_ACH_PRO FOREIGN KEY (PRO_ID) REFERENCES T_PRODUITS (PRO_ID)
    );
     
    CREATE TABLE T_VENTES (
    	VEN_ID INTEGER IDENTITY NOT NULL,
    	VEN_DATE DATE NOT NULL,
    	CLI_ID INTEGER NOT NULL,
    	CONSTRAINT PK_VEN_ID PRIMARY KEY (VEN_ID),
    	CONSTRAINT FK_VEN_CAL FOREIGN KEY (VEN_DATE) REFERENCES TR_CALENDRIER (CAL_DATE)
    );
     
    CREATE TABLE T_VENTES_SUB (
    	VEN_ID INTEGER NOT NULL,
    	PRO_ID INTEGER NOT NULL,
    	VEN_PUHT DECIMAL (8,2) NOT NULL,
    	VEN_QTE INTEGER NOT NULL,
    	CONSTRAINT PK_VEN_PRO PRIMARY KEY (VEN_ID, PRO_ID),
    	CONSTRAINT FK_VEN_ID FOREIGN KEY (VEN_ID) REFERENCES T_VENTES (VEN_ID),
    	CONSTRAINT FK_VEN_PRO FOREIGN KEY (PRO_ID) REFERENCES T_PRODUITS (PRO_ID)
    );
     
    INSERT INTO T_PRODUITS (PRO_ID, FOU_ID, PRO_LIB, PRO_PUHT_ACH, PRO_PUHT_VEN) VALUES (1, 1, 'Produit 1', 1448.12, 1880.00);
    INSERT INTO T_PRODUITS (PRO_ID, FOU_ID, PRO_LIB, PRO_PUHT_ACH, PRO_PUHT_VEN) VALUES (2, 2, 'Produit 2', 1221.36, 1625.00);
     
    INSERT INTO TR_CALENDRIER (CAL_DATE) VALUES ('2024-12-31');
    INSERT INTO TR_CALENDRIER (CAL_DATE) VALUES ('2025-01-01');
    INSERT INTO TR_CALENDRIER (CAL_DATE) VALUES ('2025-01-02');
    INSERT INTO TR_CALENDRIER (CAL_DATE) VALUES ('2025-01-03');
    INSERT INTO TR_CALENDRIER (CAL_DATE) VALUES ('2025-01-04');
    INSERT INTO TR_CALENDRIER (CAL_DATE) VALUES ('2025-01-05');
    INSERT INTO TR_CALENDRIER (CAL_DATE) VALUES ('2025-01-06');
    INSERT INTO TR_CALENDRIER (CAL_DATE) VALUES ('2025-01-07');
    INSERT INTO TR_CALENDRIER (CAL_DATE) VALUES ('2025-01-08');
    INSERT INTO TR_CALENDRIER (CAL_DATE) VALUES ('2025-01-09');
    INSERT INTO TR_CALENDRIER (CAL_DATE) VALUES ('2025-01-10');
    INSERT INTO TR_CALENDRIER (CAL_DATE) VALUES ('2025-01-11');
    INSERT INTO TR_CALENDRIER (CAL_DATE) VALUES ('2025-01-12');
    INSERT INTO TR_CALENDRIER (CAL_DATE) VALUES ('2025-01-13');
    INSERT INTO TR_CALENDRIER (CAL_DATE) VALUES ('2025-01-14');
    INSERT INTO TR_CALENDRIER (CAL_DATE) VALUES ('2025-01-15');
    INSERT INTO TR_CALENDRIER (CAL_DATE) VALUES ('2025-01-16');
    INSERT INTO TR_CALENDRIER (CAL_DATE) VALUES ('2025-01-17');
    INSERT INTO TR_CALENDRIER (CAL_DATE) VALUES ('2025-01-18');
    INSERT INTO TR_CALENDRIER (CAL_DATE) VALUES ('2025-01-19');
    INSERT INTO TR_CALENDRIER (CAL_DATE) VALUES ('2025-01-20');
    INSERT INTO TR_CALENDRIER (CAL_DATE) VALUES ('2025-01-21');
    INSERT INTO TR_CALENDRIER (CAL_DATE) VALUES ('2025-01-22');
    INSERT INTO TR_CALENDRIER (CAL_DATE) VALUES ('2025-01-23');
    INSERT INTO TR_CALENDRIER (CAL_DATE) VALUES ('2025-01-24');
    INSERT INTO TR_CALENDRIER (CAL_DATE) VALUES ('2025-01-25');
    INSERT INTO TR_CALENDRIER (CAL_DATE) VALUES ('2025-01-26');
    INSERT INTO TR_CALENDRIER (CAL_DATE) VALUES ('2025-01-27');
    INSERT INTO TR_CALENDRIER (CAL_DATE) VALUES ('2025-01-28');
    INSERT INTO TR_CALENDRIER (CAL_DATE) VALUES ('2025-01-29');
    INSERT INTO TR_CALENDRIER (CAL_DATE) VALUES ('2025-01-30');
    INSERT INTO TR_CALENDRIER (CAL_DATE) VALUES ('2025-01-31');
     
    INSERT INTO T_ACHATS (ACH_ID, ACH_DATE, FOU_ID, ACH_TYPE) VALUES (1, '2024-12-31', 1, 1);
    INSERT INTO T_ACHATS (ACH_ID, ACH_DATE, FOU_ID, ACH_TYPE) VALUES (2, '2024-12-31', 2, 1);
    INSERT INTO T_ACHATS (ACH_ID, ACH_DATE, FOU_ID, ACH_TYPE) VALUES (3, '2025-01-03', 1, 2);
    INSERT INTO T_ACHATS (ACH_ID, ACH_DATE, FOU_ID, ACH_TYPE) VALUES (4, '2025-01-08', 1, 2);
    INSERT INTO T_ACHATS (ACH_ID, ACH_DATE, FOU_ID, ACH_TYPE) VALUES (5, '2025-01-08', 2, 2);
    INSERT INTO T_ACHATS (ACH_ID, ACH_DATE, FOU_ID, ACH_TYPE) VALUES (6, '2025-01-13', 1, 2);
    INSERT INTO T_ACHATS (ACH_ID, ACH_DATE, FOU_ID, ACH_TYPE) VALUES (7, '2025-01-15', 2, 2);
    INSERT INTO T_ACHATS (ACH_ID, ACH_DATE, FOU_ID, ACH_TYPE) VALUES (8, '2025-01-17', 1, 2);
    INSERT INTO T_ACHATS (ACH_ID, ACH_DATE, FOU_ID, ACH_TYPE) VALUES (9, '2025-01-18', 1, 2);
    INSERT INTO T_ACHATS (ACH_ID, ACH_DATE, FOU_ID, ACH_TYPE) VALUES (10, '2025-01-21', 1, 2);
    INSERT INTO T_ACHATS (ACH_ID, ACH_DATE, FOU_ID, ACH_TYPE) VALUES (11, '2025-01-22', 1, 2);
    INSERT INTO T_ACHATS (ACH_ID, ACH_DATE, FOU_ID, ACH_TYPE) VALUES (12, '2025-01-23', 1, 2);
    INSERT INTO T_ACHATS (ACH_ID, ACH_DATE, FOU_ID, ACH_TYPE) VALUES (13, '2025-01-23', 2, 2);
    INSERT INTO T_ACHATS (ACH_ID, ACH_DATE, FOU_ID, ACH_TYPE) VALUES (14, '2025-01-27', 1, 2);
     
    INSERT INTO T_ACHATS_SUB (ACH_ID, PRO_ID, ACH_PUHT, ACH_QTE) VALUES (1, 1, 1449.36, 50);
    INSERT INTO T_ACHATS_SUB (ACH_ID, PRO_ID, ACH_PUHT, ACH_QTE) VALUES (2, 2, 1224.87, 50);
    INSERT INTO T_ACHATS_SUB (ACH_ID, PRO_ID, ACH_PUHT, ACH_QTE) VALUES (3, 1, 1451.29, 10);
    INSERT INTO T_ACHATS_SUB (ACH_ID, PRO_ID, ACH_PUHT, ACH_QTE) VALUES (4, 1, 1448.20, 10);
    INSERT INTO T_ACHATS_SUB (ACH_ID, PRO_ID, ACH_PUHT, ACH_QTE) VALUES (5, 2, 1228.50, 60);
    INSERT INTO T_ACHATS_SUB (ACH_ID, PRO_ID, ACH_PUHT, ACH_QTE) VALUES (6, 1, 1462.75, 20);
    INSERT INTO T_ACHATS_SUB (ACH_ID, PRO_ID, ACH_PUHT, ACH_QTE) VALUES (7, 2, 1225.40, 40);
    INSERT INTO T_ACHATS_SUB (ACH_ID, PRO_ID, ACH_PUHT, ACH_QTE) VALUES (8, 1, 1459.90, 20);
    INSERT INTO T_ACHATS_SUB (ACH_ID, PRO_ID, ACH_PUHT, ACH_QTE) VALUES (9, 1, 1460.01, 20);
    INSERT INTO T_ACHATS_SUB (ACH_ID, PRO_ID, ACH_PUHT, ACH_QTE) VALUES (10, 1, 1458.26, 20);
    INSERT INTO T_ACHATS_SUB (ACH_ID, PRO_ID, ACH_PUHT, ACH_QTE) VALUES (11, 1, 1439.35, 50);
    INSERT INTO T_ACHATS_SUB (ACH_ID, PRO_ID, ACH_PUHT, ACH_QTE) VALUES (12, 1, 1449.30, 60);
    INSERT INTO T_ACHATS_SUB (ACH_ID, PRO_ID, ACH_PUHT, ACH_QTE) VALUES (13, 2, 1221.36, 40);
    INSERT INTO T_ACHATS_SUB (ACH_ID, PRO_ID, ACH_PUHT, ACH_QTE) VALUES (14, 1, 1448.12, 50);
     
    INSERT INTO T_VENTES (VEN_ID, VEN_DATE, CLI_ID) VALUES (1, '2025-01-02', 49);
    INSERT INTO T_VENTES (VEN_ID, VEN_DATE, CLI_ID) VALUES (2, '2025-01-03', 18);
    INSERT INTO T_VENTES (VEN_ID, VEN_DATE, CLI_ID) VALUES (3, '2025-01-04', 10);
    INSERT INTO T_VENTES (VEN_ID, VEN_DATE, CLI_ID) VALUES (4, '2025-01-04', 34);
    INSERT INTO T_VENTES (VEN_ID, VEN_DATE, CLI_ID) VALUES (5, '2025-01-05', 44);
    INSERT INTO T_VENTES (VEN_ID, VEN_DATE, CLI_ID) VALUES (6, '2025-01-06', 5);
    INSERT INTO T_VENTES (VEN_ID, VEN_DATE, CLI_ID) VALUES (7, '2025-01-06', 42);
    INSERT INTO T_VENTES (VEN_ID, VEN_DATE, CLI_ID) VALUES (8, '2025-01-07', 36);
    INSERT INTO T_VENTES (VEN_ID, VEN_DATE, CLI_ID) VALUES (9, '2025-01-08', 2);
    INSERT INTO T_VENTES (VEN_ID, VEN_DATE, CLI_ID) VALUES (10, '2025-01-09', 47);
    INSERT INTO T_VENTES (VEN_ID, VEN_DATE, CLI_ID) VALUES (11, '2025-01-09', 33);
    INSERT INTO T_VENTES (VEN_ID, VEN_DATE, CLI_ID) VALUES (12, '2025-01-10', 15);
    INSERT INTO T_VENTES (VEN_ID, VEN_DATE, CLI_ID) VALUES (13, '2025-01-11', 24);
    INSERT INTO T_VENTES (VEN_ID, VEN_DATE, CLI_ID) VALUES (14, '2025-01-12', 6);
    INSERT INTO T_VENTES (VEN_ID, VEN_DATE, CLI_ID) VALUES (15, '2025-01-13', 19);
    INSERT INTO T_VENTES (VEN_ID, VEN_DATE, CLI_ID) VALUES (16, '2025-01-13', 2);
    INSERT INTO T_VENTES (VEN_ID, VEN_DATE, CLI_ID) VALUES (17, '2025-01-14', 31);
    INSERT INTO T_VENTES (VEN_ID, VEN_DATE, CLI_ID) VALUES (18, '2025-01-15', 37);
    INSERT INTO T_VENTES (VEN_ID, VEN_DATE, CLI_ID) VALUES (19, '2025-01-16', 30);
    INSERT INTO T_VENTES (VEN_ID, VEN_DATE, CLI_ID) VALUES (20, '2025-01-14', 21);
    INSERT INTO T_VENTES (VEN_ID, VEN_DATE, CLI_ID) VALUES (21, '2025-01-17', 8);
    INSERT INTO T_VENTES (VEN_ID, VEN_DATE, CLI_ID) VALUES (22, '2025-01-18', 5);
    INSERT INTO T_VENTES (VEN_ID, VEN_DATE, CLI_ID) VALUES (23, '2025-01-19', 43);
    INSERT INTO T_VENTES (VEN_ID, VEN_DATE, CLI_ID) VALUES (24, '2025-01-20', 18);
    INSERT INTO T_VENTES (VEN_ID, VEN_DATE, CLI_ID) VALUES (25, '2025-01-21', 11);
    INSERT INTO T_VENTES (VEN_ID, VEN_DATE, CLI_ID) VALUES (26, '2025-01-22', 15);
    INSERT INTO T_VENTES (VEN_ID, VEN_DATE, CLI_ID) VALUES (27, '2025-01-22', 18);
    INSERT INTO T_VENTES (VEN_ID, VEN_DATE, CLI_ID) VALUES (28, '2025-01-23', 29);
    INSERT INTO T_VENTES (VEN_ID, VEN_DATE, CLI_ID) VALUES (29, '2025-01-24', 26);
    INSERT INTO T_VENTES (VEN_ID, VEN_DATE, CLI_ID) VALUES (30, '2025-01-25', 49);
    INSERT INTO T_VENTES (VEN_ID, VEN_DATE, CLI_ID) VALUES (31, '2025-01-25', 12);
    INSERT INTO T_VENTES (VEN_ID, VEN_DATE, CLI_ID) VALUES (32, '2025-01-26', 45);
    INSERT INTO T_VENTES (VEN_ID, VEN_DATE, CLI_ID) VALUES (33, '2025-01-27', 34);
    INSERT INTO T_VENTES (VEN_ID, VEN_DATE, CLI_ID) VALUES (34, '2025-01-28', 2);
    INSERT INTO T_VENTES (VEN_ID, VEN_DATE, CLI_ID) VALUES (35, '2025-01-29', 40);
    INSERT INTO T_VENTES (VEN_ID, VEN_DATE, CLI_ID) VALUES (36, '2025-01-29', 7);
    INSERT INTO T_VENTES (VEN_ID, VEN_DATE, CLI_ID) VALUES (37, '2025-01-30', 27);
    INSERT INTO T_VENTES (VEN_ID, VEN_DATE, CLI_ID) VALUES (38, '2025-01-31', 25);
     
    INSERT INTO T_VENTES_SUB (VEN_ID, PRO_ID, VEN_PUHT, VEN_QTE) VALUES (1, 1, 1880.00, 24);
    INSERT INTO T_VENTES_SUB (VEN_ID, PRO_ID, VEN_PUHT, VEN_QTE) VALUES (2, 1, 1880.00, 6);
    INSERT INTO T_VENTES_SUB (VEN_ID, PRO_ID, VEN_PUHT, VEN_QTE) VALUES (3, 2, 1625.00, 20);
    INSERT INTO T_VENTES_SUB (VEN_ID, PRO_ID, VEN_PUHT, VEN_QTE) VALUES (4, 1, 1880.00, 2);
    INSERT INTO T_VENTES_SUB (VEN_ID, PRO_ID, VEN_PUHT, VEN_QTE) VALUES (5, 1, 1880.00, 1);
    INSERT INTO T_VENTES_SUB (VEN_ID, PRO_ID, VEN_PUHT, VEN_QTE) VALUES (6, 1, 1880.00, 5);
    INSERT INTO T_VENTES_SUB (VEN_ID, PRO_ID, VEN_PUHT, VEN_QTE) VALUES (7, 2, 1625.00, 18);
    INSERT INTO T_VENTES_SUB (VEN_ID, PRO_ID, VEN_PUHT, VEN_QTE) VALUES (8, 1, 1880.00, 4);
    INSERT INTO T_VENTES_SUB (VEN_ID, PRO_ID, VEN_PUHT, VEN_QTE) VALUES (9, 1, 1880.00, 3);
    INSERT INTO T_VENTES_SUB (VEN_ID, PRO_ID, VEN_PUHT, VEN_QTE) VALUES (10, 1, 1880.00, 4);
    INSERT INTO T_VENTES_SUB (VEN_ID, PRO_ID, VEN_PUHT, VEN_QTE) VALUES (11, 2, 1625.00, 30);
    INSERT INTO T_VENTES_SUB (VEN_ID, PRO_ID, VEN_PUHT, VEN_QTE) VALUES (12, 1, 1880.00, 2);
    INSERT INTO T_VENTES_SUB (VEN_ID, PRO_ID, VEN_PUHT, VEN_QTE) VALUES (13, 1, 1880.00, 2);
    INSERT INTO T_VENTES_SUB (VEN_ID, PRO_ID, VEN_PUHT, VEN_QTE) VALUES (14, 1, 1880.00, 8);
    INSERT INTO T_VENTES_SUB (VEN_ID, PRO_ID, VEN_PUHT, VEN_QTE) VALUES (15, 1, 1880.00, 9);
    INSERT INTO T_VENTES_SUB (VEN_ID, PRO_ID, VEN_PUHT, VEN_QTE) VALUES (16, 2, 1625.00, 40);
    INSERT INTO T_VENTES_SUB (VEN_ID, PRO_ID, VEN_PUHT, VEN_QTE) VALUES (17, 1, 1880.00, 5);
    INSERT INTO T_VENTES_SUB (VEN_ID, PRO_ID, VEN_PUHT, VEN_QTE) VALUES (18, 1, 1880.00, 1);
    INSERT INTO T_VENTES_SUB (VEN_ID, PRO_ID, VEN_PUHT, VEN_QTE) VALUES (19, 1, 1880.00, 3);
    INSERT INTO T_VENTES_SUB (VEN_ID, PRO_ID, VEN_PUHT, VEN_QTE) VALUES (20, 2, 1625.00, 1);
    INSERT INTO T_VENTES_SUB (VEN_ID, PRO_ID, VEN_PUHT, VEN_QTE) VALUES (21, 1, 1880.00, 14);
    INSERT INTO T_VENTES_SUB (VEN_ID, PRO_ID, VEN_PUHT, VEN_QTE) VALUES (22, 1, 1880.00, 3);
    INSERT INTO T_VENTES_SUB (VEN_ID, PRO_ID, VEN_PUHT, VEN_QTE) VALUES (23, 1, 1880.00, 18);
    INSERT INTO T_VENTES_SUB (VEN_ID, PRO_ID, VEN_PUHT, VEN_QTE) VALUES (24, 1, 1880.00, 2);
    INSERT INTO T_VENTES_SUB (VEN_ID, PRO_ID, VEN_PUHT, VEN_QTE) VALUES (25, 1, 1880.00, 12);
    INSERT INTO T_VENTES_SUB (VEN_ID, PRO_ID, VEN_PUHT, VEN_QTE) VALUES (26, 1, 1880.00, 40);
    INSERT INTO T_VENTES_SUB (VEN_ID, PRO_ID, VEN_PUHT, VEN_QTE) VALUES (27, 2, 1625.00, 2);
    INSERT INTO T_VENTES_SUB (VEN_ID, PRO_ID, VEN_PUHT, VEN_QTE) VALUES (28, 1, 1880.00, 15);
    INSERT INTO T_VENTES_SUB (VEN_ID, PRO_ID, VEN_PUHT, VEN_QTE) VALUES (29, 1, 1880.00, 12);
    INSERT INTO T_VENTES_SUB (VEN_ID, PRO_ID, VEN_PUHT, VEN_QTE) VALUES (30, 1, 1880.00, 11);
    INSERT INTO T_VENTES_SUB (VEN_ID, PRO_ID, VEN_PUHT, VEN_QTE) VALUES (31, 2, 1625.00, 15);
    INSERT INTO T_VENTES_SUB (VEN_ID, PRO_ID, VEN_PUHT, VEN_QTE) VALUES (32, 1, 1880.00, 20);
    INSERT INTO T_VENTES_SUB (VEN_ID, PRO_ID, VEN_PUHT, VEN_QTE) VALUES (33, 1, 1880.00, 30);
    INSERT INTO T_VENTES_SUB (VEN_ID, PRO_ID, VEN_PUHT, VEN_QTE) VALUES (34, 1, 1880.00, 12);
    INSERT INTO T_VENTES_SUB (VEN_ID, PRO_ID, VEN_PUHT, VEN_QTE) VALUES (35, 1, 1880.00, 3);
    INSERT INTO T_VENTES_SUB (VEN_ID, PRO_ID, VEN_PUHT, VEN_QTE) VALUES (36, 2, 1625.00, 14);
    INSERT INTO T_VENTES_SUB (VEN_ID, PRO_ID, VEN_PUHT, VEN_QTE) VALUES (37, 1, 1880.00, 3);
    INSERT INTO T_VENTES_SUB (VEN_ID, PRO_ID, VEN_PUHT, VEN_QTE) VALUES (38, 1, 1880.00, 5);
    Note : dans ce jeu de données (2 produits, 14 achats et 38 ventes), chaque achat (et idem pour chaque vente) ne contient qu'une seule ligne.

    L'affichage de la requête se fait sur une période définie avec T_CALENDRIER : une ligne vide s'affiche le jour où il n'y a ni achat ni vente (au total, les 32 lignes de la table doivent s'afficher).

    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
    SELECT
    CAL_DATE,
    P1.PRO_ID AS PRO_ACH,
    P2.PRO_ID AS PRO_VEN,
    ACH_PUHT,
    SUM (COALESCE (ACH_QTE, 0)) AS ACH_QTE,
    SUM (ACH_PUHT * ACH_QTE) AS ACH_TTL,
    SUM (COALESCE (VEN_QTE, 0)) AS VEN_QTE
    FROM TR_CALENDRIER C
    LEFT OUTER JOIN T_ACHATS A1 ON C.CAL_DATE = A1.ACH_DATE
    LEFT OUTER JOIN T_ACHATS_SUB A2 ON A1.ACH_ID = A2.ACH_ID
    LEFT OUTER JOIN T_VENTES V1 ON C.CAL_DATE = V1.VEN_DATE
    LEFT OUTER JOIN T_VENTES_SUB V2 ON V1.VEN_ID = V2.VEN_ID
    LEFT OUTER JOIN T_PRODUITS P1 ON A2.PRO_ID = P1.PRO_ID
    LEFT OUTER JOIN T_PRODUITS P2 ON V2.PRO_ID = P2.PRO_ID
    GROUP BY CAL_DATE, PRO_ACH, PRO_VEN, ACH_PUHT
    La requête fonctionne correctement lorsqu'il n'y a qu'un produit dans les achats/ventes, mais c'est la clause WHERE pour le filtrage qui ne va pas lorsqu'il y en a au moins deux.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE ((PRO_ACH = 1 OR PRO_ACH IS NULL) AND (PRO_VEN = 1 OR PRO_VEN IS NULL))
    Avec cette clause, il manque une ligne (le 2025-01-15) avec le produit 1. En testant avec le produit 2, ça n'affiche que 8 lignes.

    Merci du coup de main.

  2. #2
    Expert confirmé
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 350
    Détails du profil
    Informations personnelles :
    Âge : 47
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 350
    Billets dans le blog
    17
    Par défaut
    c'est la clause WHERE pour le filtrage qui ne va pas lorsqu'il y en a au moins deux.
    Sauf erreur, dans ton dataset il n'y jamais plus de 1 produit par achat/vente.
    Tu peux le modifier pour tests ?

    mais c'est la clause WHERE pour le filtrage qui ne va pas lorsqu'il y en a au moins deux
    Hum, au final tu veux quoi ? Le nombre d'achats et de ventes par produit et par jour ?
    1 ligne = 1 produit ayant eu au moins 1 achat ou au moins 1 vente sur la journée ?
    Si 1 produit n'a ni vente et ni achat sur 1 journée, tu veux 1 ligne à 0 ou ne pas faire apparaitre la ligne ?
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  3. #3
    Membre éclairé Avatar de Nerva
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    413
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 413
    Par défaut
    Pour ne pas compliquer les choses, je n'ai inséré qu'une ligne pour chaque vente, mais il peut y en avoir (théoriquement) autant qu'il y a de produits (un client peut acheter ce qu'il veut en une seule fois).

    Pour les achats, pareil, puisqu'un fournisseur distribue plusieurs produits et un revendeur peut faire une commande avec plusieurs produits en une seule fois.

    C'est pour cette raison que j'ai mis un GROUP BY afin de pouvoir cumuler quotidiennement (essentiellement) la quantité totale vendue, produit par produit (pour la quantité achetée, le cumul se fait aussi même si il est peu probable qu'un revendeur effectue plus d'une commande par jour d'un produit à son fournisseur). Bien que je n'en sois pas encore là, la finalité c'est la gestion des stocks, donc, produit par produit.

    Dans une base de test, j'ai supprimé tous les achats et ventes du produit 2. L'instantané du produit 1 s'affiche ainsi (32 lignes), ce qui est le résultat escompté (10 achats et 30 ventes).



    On affiche donc :

    - lignes d'achat seules
    - lignes de vente seules
    - lignes d'achat et de vente
    - lignes sans achat ni vente

  4. #4
    Membre Expert
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 176
    Par défaut
    Bonjour,
    Si j'ai bien compris, tu veux ça :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    WHERE (P1.PRO_ID = 1 and P2.PRO_ID is null) 
       or (P2.PRO_ID = 1 and P1.PRO_ID is null) 
       or (P1.PRO_ID is not null and P2.PRO_ID is not null) 
       or (P1.PRO_ID is null and P2.PRO_ID is null)

  5. #5
    Membre éclairé Avatar de Nerva
    Profil pro
    Inscrit en
    Juin 2004
    Messages
    413
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2004
    Messages : 413
    Par défaut
    Citation Envoyé par vanagreg Voir le message
    Bonjour,Si j'ai bien compris, tu veux ça :
    Non. Là ça retourne 36 lignes, des doublons et des références au produit 2.

  6. #6
    Membre Expert
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 176
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Nord (Nord Pas de Calais)

    Informations professionnelles :
    Activité : Développeur Oracle

    Informations forums :
    Inscription : Décembre 2019
    Messages : 1 176
    Par défaut
    ok tu veux que le produit 1 dans pro_ach ou pro_ven, ou rien dans les deux. J'aurais mis ça alors:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    WHERE (P1.PRO_ID = 1 and P2.PRO_ID = 1) or (P1.PRO_ID = 1 and P2.PRO_ID is null) or (P2.PRO_ID = 1 and P1.PRO_ID is null) or (P1.PRO_ID is null and P2.PRO_ID is null)
    mais dans cas pourquoi la ligne du 15/01/2025 remonte vu que pro_ach = 2 ?

Discussions similaires

  1. Utiliser un alias de colonne dans une clause Where MS SQL
    Par sir dragorn dans le forum Langage SQL
    Réponses: 11
    Dernier message: 12/10/2011, 09h31
  2. fonction booleenne dans une clause where ?
    Par user_h dans le forum Oracle
    Réponses: 1
    Dernier message: 20/10/2005, 15h05
  3. Une clause WHERE avant un LEFT JOIN ?
    Par bugalood dans le forum Langage SQL
    Réponses: 11
    Dernier message: 27/07/2005, 14h22
  4. [super requete] Dumper un model avec une clause where
    Par elievar dans le forum Langage SQL
    Réponses: 3
    Dernier message: 16/03/2005, 17h05

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