Comment calculer une différence entre 2 tables ?
yg_be Messages postés 23541 Date d'inscription Statut Contributeur Dernière intervention -
***** 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.
- Comment calculer une différence entre 2 tables ?
- Comment calculer la moyenne sur excel - Guide
- Supercopier 2 - Télécharger - Gestion de fichiers
- Différence entre tcp et udp - Guide
- Difference entre million et milliard - Accueil - Technologies
- Comment faire une table des matières sur word - Guide
1 réponse
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"?