Comment calculer une différence entre 2 tables ?

cs_jmclej Messages postés 6 Date d'inscription vendredi 5 novembre 2004 Statut Membre Dernière intervention 18 octobre 2023 - Modifié le 18 oct. 2023 à 10:32
yg_be Messages postés 22805 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 mai 2024 - 18 oct. 2023 à 13:33

***** Bonjour.

***** Voir cette page.


J'ai une table TableA qui est comme cela :
ViewDate    ID    prime    otherfields
31/07/2023    1    10    titi
31/07/2023    1    10    titi
31/07/2023    1    10    toto
31/07/2023    2    10    tata
31/07/2023    2    10    tata
31/07/2023    2    10    tutu
Et une table TableB qui est comme cela :
ViewDate    ID    prime    otherfields
31/08/2023    2    10    tata
31/08/2023    2    30    tata
31/08/2023    2    30    tutu
31/08/2023    3    30    tata
31/08/2023    3    30    tata
31/08/2023    3    30    tutu
Je veux calculer la variation ligne à ligne entre les 2 tables avec les règles suivantes :
Si un même ID est trouvé, alors la valeur du champs prime est égale à prime de TableB - prime de TableA
Si un ID n'est pas présent dans TableA, alors je veux quand même une ligne avec la valeur du champs prime égale à prime de TableB - 0
Si un ID n'est pas présent dans TableB, alors je veux quand même une ligne avec la valeur du champs prime égale à prime de 0 - TableA
Si un résultat de variation est égale à 0, alors je supprime la ligne en question
Je m'attends donc à avoir le résultat suivant (moins la ligne où prime = 0) :
ViewDate    ID    prime    otherfields
31/08/2023    1    -10    titi
31/08/2023    1    -10    titi
31/08/2023    1    -10    toto
31/08/2023    2    0    tata
31/08/2023    2    20    tata
31/08/2023    2    20    tutu
31/08/2023    3    30    tata
31/08/2023    3    30    tata
31/08/2023    3    30    tutu
Ma requête actuelle, en spark SQL qui doit s'exécuter sur databricks, est la suivante :
create table rmop.TableA (ViewDate date, ID integer, prime integer, otherfield string);
create table rmop.TableB (ViewDate date, ID integer, prime integer, otherfield string);
create table rmop.TableVAR (ViewDate date, ID integer, prime integer, otherfield string);

insert into rmop.TableA select '2023-07-31', 1, 10, 'titi';
insert into rmop.TableA select '2023-07-31', 1, 10, 'titi';
insert into rmop.TableA select '2023-07-31', 1, 10, 'toto';
insert into rmop.TableA select '2023-07-31', 2, 10, 'tata';
insert into rmop.TableA select '2023-07-31', 2, 10, 'tata';
insert into rmop.TableA select '2023-07-31', 2, 10, 'tutu';

insert into rmop.TableB select '2023-08-31', 2, 10, 'tata';
insert into rmop.TableB select '2023-08-31', 2, 30, 'tata';
insert into rmop.TableB select '2023-08-31', 2, 30, 'tutu';
insert into rmop.TableB select '2023-08-31', 3, 30, 'tata';
insert into rmop.TableB select '2023-08-31', 3, 30, 'tata';
insert into rmop.TableB select '2023-08-31', 3, 30, 'tutu';

insert into rmop.TableVAR (ViewDate, ID, prime, otherfield)
select 
B.ViewDate,
COALESCE(A.ID, B.ID),
COALESCE(B.prime, 0) - COALESCE(A.prime, 0),
COALESCE(A.otherfield, B.otherfield)
from rmop.TableA A full outer join rmop.TableB B on A.ID = B.ID
where A.ViewDate ='2023-07-31' and B.ViewDate ='2023-08-31';

select * from rmop.TableVAR;
delete from rmop.TableVAR where prime = 0;

drop table rmop.TableA;
drop table rmop.TableB;
drop table rmop.TableVAR;
Le problème est que cela me retourne le résulat suivant :
ViewDate    ID    prime    otherfields
31/08/2023    2    0    tata
31/08/2023    2    0    tata
31/08/2023    2    0    tutu
31/08/2023    2    20    tata
31/08/2023    2    20    tata
31/08/2023    2    20    tutu
31/08/2023    2    20    tata
31/08/2023    2    20    tata
31/08/2023    2    20    tutu
Quel est le problème dans ma requête et comment la corriger pour qu'elle retourne le résultat attendu s'il vous plaît ?
Je sais que je ne fais pas la jointure sur otherfields car ce ne sont pas des identifiants.


A voir également:

1 réponse

yg_be Messages postés 22805 Date d'inscription lundi 9 juin 2008 Statut Contributeur Dernière intervention 23 mai 2024 1 469
18 oct. 2023 à 13:33

bonjour,

je ne comprends pas:

  • c'est quoi une variation "ligne à ligne"?
  • je ne comprends pas comment tu arrives au résultat attendu
  • il me semble qu'il manque un champ dans tes tables.  peut-être ce que tu appelles la "ligne"?
0