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

  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 376
    Détails du profil
    Informations personnelles :
    Âge : 48
    Localisation : France

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

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 376
    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 ?

  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 185
    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 185
    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 185
    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 185
    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 ?

  7. #7
    Expert éminent
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 258
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 258
    Billets dans le blog
    16
    Par défaut
    Bonjour Nerva,
     
    Je n’ai pas analysé votre problème, car conceptuellement parlant, il se pourrait qu’il y ait du mou dans la corde à noeuds.

    A propos de la table T_PRODUITS, j’observe l’existence de la dépendance fonctionnelle
     
    PRO_ID → PRO_PUHT_ACH
     

    D’accord. Maintenant si pour la table T_ACHATS_SUB, il existe aussi la dépendance fonctionnelle

    PRO_ID → ACH_PUHT
     
    alors il y a très vraisemblablement viol de la 2e forme normale, dans la mesure où la colonne ACH_PUHT ne dépendrait que d’une partie de la clé de la table T_ACHATS_SUB.

    Quid de cette éventuelle dépendance fonctionnelle ?

  8. #8
    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
    vanagreg, Le 15/01, il y a 1 achat pour le produit 2 et 1 vente pour le produit 1. Et le retour donne 31 lignes ; la vente du 15 n'y figure pas alors qu'elle devrait.



    fsmrel
    Pour ce qui est de T_PRODUITS, le tarif fournisseur d'un produit est amené à changer plus ou moins régulièrement. Lorsque l'application et la base sont fonctionnelles, du code-client est chargé (dans le formulaire adéquat) de copier le PU de la table T_PRODUITS (via une liste déroulante) dans la colonne PU de T_ACHATS_SUB, histoire de gagner du temps et d'éviter toute erreur de saisie. C'est donc le dernier tarif en date qui figure dans T_PRODUITS (dans ce jeu exemple, 1448.12 pour le 1 et 1221.36 pour le 2). Et ce tarif sera modifié dans T_PRODUITS à chaque fois que le fournisseur indiquera un changement. Il n'y a aucune historisation dans cette table, les tarifs antérieurs figurant dans T_ACHATS_SUB.

  9. #9
    Expert éminent
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 258
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 258
    Billets dans le blog
    16
    Par défaut
    Citation Envoyé par Nerva
    Il n'y a aucune historisation dans cette table, les tarifs antérieurs figurant dans T_ACHATS_SUB.
     
    D’accord. Il n’y a pas de viol de deuxième forme normale.

    Autre remarque :

    Les tables T_PRODUITS et T_ACHATS sont toutes les deux dotées d’une colonne FOU_ID. On en déduit que le fournisseur à qui l’on achète un produit n’est pas nécessairement celui qui fournit ce produit.
    Qu’en est-il ?

  10. #10
    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 fsmrel Voir le message
    Les tables T_PRODUITS et T_ACHATS sont toutes les deux dotées d’une colonne FOU_ID. On en déduit que le fournisseur à qui l’on achète un produit n’est pas nécessairement celui qui fournit ce produit.
    Qu’en est-il ?
    Si, c'est celui à qui on achète qui fournit. Lorsqu'on passe une commande, une fois qu'on a sélectionné le fournisseur dans le formulaire de saisie (T_ACHATS), il faut que seuls les produits vendus par ce fournisseur soient sélectionnables dans le sous-formulaire (T_ACHATS_SUB). Reporter l'ID fournisseur dans chaque produit est donc indispensable pour le filtrage.

  11. #11
    Membre Expert
    Homme Profil pro
    Développeur Oracle
    Inscrit en
    Décembre 2019
    Messages
    1 185
    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 185
    Par défaut
    Citation Envoyé par Nerva Voir le message
    vanagreg, Le 15/01, il y a 1 achat pour le produit 2 et 1 vente pour le produit 1. Et le retour donne 31 lignes ; la vente du 15 n'y figure pas alors qu'elle devrait.

    Ok, je n'ai pas bien compris ce que tu voulais retourner comme lignes alors.

  12. #12
    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
    Ok, je n'ai pas bien compris ce que tu voulais retourner comme lignes alors.
    Retourner toutes les lignes du produit 1 (dans cet exemple). Je ne comprends pas pourquoi la ligne du 15/01 n'apparaît pas avec ta clause.

  13. #13
    Expert éminent
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 258
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 258
    Billets dans le blog
    16
    Par défaut
    Bonjour Nerva,

    Le GROUP BY est manifestement la cause du problème.

    Si on code (pas de GROUP BY) :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    select a.ACH_DATE
    from T_ACHATS as a left join T_ACHATS_SUB as b on  a.ACH_ID = b.ACH_ID
    and b.PRO_ID = 1 ;

    alors la date du 2025-01-15 est bien prise en compte.

    Si on code :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select a.ACH_DATE
    , SUM (COALESCE (ACH_QTE, 0)) AS ACH_Q
    from T_ACHATS as a left join T_ACHATS_SUB as b on  a.ACH_ID = b.ACH_ID
    and b.PRO_ID = 1
    group by a.ACH_DATE, ACH_Q ;

    Alors SQL rouspète, à cause de la présence de ACH_Q dans le group by.

    Si on code :

    Code SQL : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select a.ACH_DATE
    , SUM (COALESCE (ACH_QTE, 0)) AS ACH_Q
    from T_ACHATS as a left join T_ACHATS_SUB as b on  a.ACH_ID = b.ACH_ID
    and b.PRO_ID = 1
    group by a.ACH_DATE, ACH_QTE ;

    Alors SQL ne rouspète pas, mais la date du 2025-01-15 n’est pas prise en compte, il l’attend donc dans la table T_ACHATS_SUB. Dans cette histoire, ACH_Q n’est pas partie prenante.

  14. #14
    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
    J'ai beau me creuser la tête, je ne vois pas ce que la ligne du 15/01 a de différent des autres. Il y a au total 21 jours où il y a uniquement des sorties et seule celle-ci n'est pas retournée.

  15. #15
    Expert éminent
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 258
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 258
    Billets dans le blog
    16
    Par défaut
    Nerva, quel est votre SGBD ?

    Pour ma part, j’utilise SQL Server, lequel n’autorise pas les noms d’alias dans le GROUP BY : PRO_ACH, PRO_VEN y sont donc refusés.

  16. #16
    Expert éminent
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 258
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 258
    Billets dans le blog
    16
    Par défaut
    En mettant plat, c’est-à-dire en procédant à l’union des 3 groupes : achats effectifs, ventes effectives, absence d’opération, on fait un pas vers ce qui est recherché, à savoir la présence d’un achat au 15/01/2025. Pour que SQL Server ne râle pas, ne figurent dans les GROUP BY que les noms des colonnes des tables (pas d’alias). je traite tous les produits et ignore l'estétique. Ça n’est qu’un début, puisqu’au résultat il ne faut qu’une ligne par date.

    Affaire à suivre...

    Code SQL : 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
    select a.ACH_DATE AS OPER_DATE
    , PRO_ID
    , ACH_PUHT AS OPER_PUHT
    , SUM (COALESCE (ACH_QTE, 0)) AS OPER_QTE
    , SUM (ACH_PUHT * ACH_QTE) AS OPER_TTL
    , 'group ACH !' as 'group ACH/VEN !'  
    from T_ACHATS as a left join T_ACHATS_SUB as b on  a.ACH_ID = b.ACH_ID
    group by a.ACH_DATE, PRO_ID, ACH_PUHT, ACH_QTE, ACH_PUHT * ACH_QTE
     
    union
     
    select a.VEN_DATE
    , PRO_ID
    , VEN_PUHT
    , SUM (COALESCE (VEN_QTE, 0)) AS VEN_Q
    , SUM (VEN_PUHT * VEN_QTE) AS VEN_TTL
    , 'group VEN !' as 'group VEN !'  
    from T_VENTES as a left join T_VENTES_SUB as b on  a.VEN_ID = b.VEN_ID
    group by a.VEN_DATE, PRO_ID, VEN_PUHT, VEN_QTE, VEN_PUHT * VEN_QTE
     
    union
     
    select CAL_DATE, 0, 0, 0, 0, 'group Null !' as 'group null !'
    from TR_CALENDRIER as c
    where not exists(select * from T_ACHATS where ACH_DATE = c.CAL_DATE)
     
    order by 1 ;

  17. #17
    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
    C'est sur HSQLDB, le moteur intégré de LibreOffice Base. Mais je viens de faire un essai avec Postgre, la ligne du 15 est également inconnue au bataillon avec cette clause :

    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)
    Enfin j'ai testé votre dernière requête dans Postgre :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SQL Error [42601]: ERROR: syntax error at or near "'group ACH/VEN !'"
    Et en HSQLDB ça retourne un message d'erreur similaire.

    Je pense que le gros problème de cette affaire est que PRO_ID figure dans les deux tables. Je finis donc par croire que la conception n'est pas bonne pour l'objectif final...

  18. #18
    Expert éminent
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 258
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 258
    Billets dans le blog
    16
    Par défaut
    Bonsoir Nerva,


    Citation Envoyé par Nerva
    j'ai testé votre dernière requête dans Postgre :
    SQL Error [42601]: ERROR: syntax error at or near "'group ACH/VEN !'"
    Ça n’est que du commentaire, manifestement propre à SQL Server.

    Je vire les comentaires, mais le résultat sera moins causant :

    Code SQL : 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
    select a.ACH_DATE AS OPER_DATE
    , PRO_ID
    , ACH_PUHT AS OPER_PUHT
    , SUM (COALESCE (ACH_QTE, 0)) AS OPER_QTE
    , SUM (ACH_PUHT * ACH_QTE) AS OPER_TTL
    from T_ACHATS as a left join T_ACHATS_SUB as b on  a.ACH_ID = b.ACH_ID
    group by a.ACH_DATE, PRO_ID, ACH_PUHT, ACH_QTE, ACH_PUHT * ACH_QTE
     
    union
     
    select a.VEN_DATE
    , PRO_ID
    , VEN_PUHT
    , SUM (COALESCE (VEN_QTE, 0)) AS VEN_Q
    , SUM (VEN_PUHT * VEN_QTE) AS VEN_TTL
    from T_VENTES as a left join T_VENTES_SUB as b on  a.VEN_ID = b.VEN_ID
    group by a.VEN_DATE, PRO_ID, VEN_PUHT, VEN_QTE, VEN_PUHT * VEN_QTE
     
    union
     
    select CAL_DATE, 0, 0, 0, 0, 'group Null !' as 'group null !'
    from TR_CALENDRIER as c
    where not exists (select * from T_ACHATS where ACH_DATE = c.CAL_DATE)
      and not exists (select * from T_VENTES where VEN_DATE = c.CAL_DATE)
     
    order by 1 ;

  19. #19
    Expert éminent
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 258
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 258
    Billets dans le blog
    16
    Par défaut
    N.B.

    en remplacement du commentaire qui lui pose un problème :

    'group ACH !' as 'group ACH/VEN !'

    est-ce que PostgreSQL accepte le commentaire suivant

    'group ACH !' as GROUP_ACH_VEN

  20. #20
    Expert éminent
    Avatar de fsmrel
    Homme Profil pro
    Spécialiste en bases de données
    Inscrit en
    Septembre 2006
    Messages
    8 258
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Essonne (Île de France)

    Informations professionnelles :
    Activité : Spécialiste en bases de données
    Secteur : Conseil

    Informations forums :
    Inscription : Septembre 2006
    Messages : 8 258
    Billets dans le blog
    16
    Par défaut
    A partir de la requête que j’ai proposée, j’ai créé la vue suivante :

    Code SQL : 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
    create view achats_group
    (OPER_DATE 
    , OPER_PRO 
    , OPER_PUHT
    , OPER_QTE
    , OPER_TTL
    , OPER_TYPE
    )
    as
     
    select a.ACH_DATE AS OPER_DATE
    , PRO_ID
    , ACH_PUHT AS OPER_PUHT
    , SUM (COALESCE (ACH_QTE, 0)) AS OPER_QTE
    , SUM (ACH_PUHT * ACH_QTE) AS OPER_TTL
    , 'ACHATS'  
    from T_ACHATS as a left join T_ACHATS_SUB as b on  a.ACH_ID = b.ACH_ID
    group by a.ACH_DATE, PRO_ID, ACH_PUHT, ACH_QTE, ACH_PUHT * ACH_QTE
     
    union
     
    select a.VEN_DATE
    , PRO_ID
    , VEN_PUHT
    , SUM (COALESCE (VEN_QTE, 0)) AS VEN_Q
    , SUM (VEN_PUHT * VEN_QTE) AS VEN_TTL
    , 'VENTES'  
    from T_VENTES as a left join T_VENTES_SUB as b on  a.VEN_ID = b.VEN_ID
    group by a.VEN_DATE, PRO_ID, VEN_PUHT, VEN_QTE, VEN_PUHT * VEN_QTE
     
    union
     
    select CAL_DATE, 0, 0, 0, 0, 'RIEN'
    from TR_CALENDRIER as c
    where not exists (select * from T_ACHATS where ACH_DATE = c.CAL_DATE)
      and not exists  (select * from T_VENTES where VEN_DATE = c.CAL_DATE)
    ;

    Si pour une journée donnée on a achat et vente, on aura deux lignes.

    Exemple, produits autres que 2 :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select * 
    from achats_group
    where OPER_PRO <> 2
    order by OPER_DATE
    ;

    =>

    Produit 2 :

    Code sql : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    select * 
    from achats_group
    where OPER_PRO = 2
    order by OPER_DATE
    ;

    =>

    Ainsi en va-t-il de la journée du 15 janvier. C’est un début. Affaire à suivre...

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