Affichage par Tranche

Petit nouveau ! | 3 Messages

16 nov. 2020, 17:24

Bonjour à tous,

tout nouveau sur le forum (Niveau débutant en SQL), je me permets de vous solliciter pour m'aider à finaliser une requête.

Contexte

Je bosse sur un projet autour du trading.
Je récupère des données sous format .csv, que j'importe dans ma bdd.
La table concernée s'appelle : market1price

Colonne & Données

Les colonnes concernées dans ma réquete sont : country, market et price1, fin1 & fin2

Dans ma colonne country, j'ai des valeurs Varchar (france, england, belgium, etc...)
Dans ma colonne market, j'ai des valeurs Varchar (local, national, european)
Dans ma colonne price1, j'ai des valeurs Decimal (1.01, 1.03, 1.06, 1.15, etc...)
Dans ma colonne fin1, j'ai des valeurs int (1,2,3,4,etc...)
Dans ma colonne fin 2, j'ai des valeurs int (1,2,3,4,etc...)

But

Je dois calculer le profit ou la perte de chaque prix stocké, en fonction du résultat du calcul de fin1+fin2.
Si fin1+fin2 > 0, alors je pourrais définir si le prix de l'action a été profitable ou non.
Une fois les calculs effectués, je dois les afficher dans un tableau.

Il y aura un tableau pour chaque couple 'country' - 'market'.
Pour chaque couple, j'ai
une première colonne qui m'affiche l'ensemble des price1 (de manière unique, pas de doublons)
une deuxième colonne qui m'affiche le nombre de fois où l'on retrouve dans la colonne le price1
une troisième colonne qui m'affiche la résultat (somme de tous les profits et pertes) par price1.

Voici la requête :

Code : Tout sélectionner

SELECT country, market, price1, COUNT(*) AS nb_times, SUM(IF(fin1 + fin2 > 0, 1*price1 - 1, -1)) AS 'PROFIT & LOSS' FROM market1price WHERE country = 'FRANCE' AND market = 'national' AND price1 BETWEEN 1.01 AND 1000 GROUP BY country, market, price1
Compte tenu que le nombre de price1 peut être varié et large, j'aimerais pouvoir afficher cela par tranche de price1.
Au lieu d'avoir une liste allant de 1.01 à 1000, j'aimerais pouvoir effectuer le calcul et voir les résultats par tranche, du style :


1.01 to 1.05
1.06 to 1.10
1.11 to 1.20
etc...

Est ce que quelqu'un serait il capable de me filer un petit coup de main pour finaliser tout cela ?

Je vous remercie d'avance pour votre aide !

Mammouth du PHP | 1701 Messages

17 nov. 2020, 11:35

tu peux utiliser un CASE https://sql.sh/cours/case
pour définir de quelle tranche il s'agit ensuite l'inclure dans ton group by
si tes tranches sont régulière tu peux aussi les calculer avec une fonction

soustrait le minimum divise par la largeur de la tranche et prends l'entier inférieure
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Petit nouveau ! | 3 Messages

18 nov. 2020, 10:30

Bonjour Spols,

j'ai essayé d'intégrer un CASE dans le GROUP BY, mais je n'ai pas eu le résultat attendu.

J'ai modifié le SELECT, afin de ne me focaliser que sur les données de price1 :

Code : Tout sélectionner

SELECT price1, COUNT(*) AS nb_times, SUM(IF(fin1 + fin2 > 0, 1*price1 - 1, -1)) AS 'PROFIT & LOSS' FROM market1price WHERE country = 'FRANCE' AND market = 'national' AND price1 BETWEEN 1.01 AND 1000 GROUP BY CASE price1 WHEN price1 < 1.10 THEN 'tranche1' ELSE 'tranche2' END
En faisant ca je me retrouve avec un tableau regroupant bien des prix par tranche...
J'ai deux tranches qui 1.04 et 1.10...en lieu est place d'une longue liste de prix différents.
Je ne comprends pas pourquoi je me retrouve avec les deux tranches 1.04 et 1.10 alors, que j'aurais aimé me retrouver avec 'tranche1' et 'tranche2'.

J'ai aussi testé ca :

Code : Tout sélectionner

SELECT price1, COUNT(*) AS nb_times, SUM(IF(fin1 + fin2 > 0, 1*price1 - 1, -1)) AS 'PROFIT & LOSS' FROM market1price WHERE country = 'FRANCE' AND market = 'national' AND price1 BETWEEN 1.01 AND 1000 GROUP BY CASE price1 WHEN price1 < '1.10' THEN 'tranche1' ELSE 'tranche2' END
J'ai le même résultat.

Est ce que mon CASE est bien déclaré ?

Merci pour ton aide.

Mammouth du PHP | 1701 Messages

18 nov. 2020, 12:16

oui mais tu l'a mis dans ta clause group by pas dans la clause SELECT

je pense que si tu le met dans ton SELECT tu vera le bon énoncé dans ton résultat. et ton GROUP BY peut referencer ton CASE si tu lui donne un alias
Spols
pour les fan de rubik's cube ou pour les curieux ==> le portail francophone du rubik's cube

Petit nouveau ! | 3 Messages

18 nov. 2020, 12:44

Merci ca avance, mais c'est pas encore ca.

Voici la progression de ma requête en incluant le CASE dans le select, et en lui attribuant un Alias :

Code : Tout sélectionner

SELECT (CASE price1 WHEN price1 BETWEEN 1.01 AND 1.10 THEN 'tranche1' ELSE 'tranche2' END) AS TRANCHE, COUNT(*) AS nb_times, SUM(IF(fin1 + fin2 > 0, 1*price1 - 1, -1)) AS 'PROFIT & LOSS' FROM market1price WHERE country = 'FRANCE' AND market = 'national' AND price1 BETWEEN 1.01 AND 1000 GROUP BY TRANCHE
En faisant, je vois bien mon alias dans le header de la colonne, sauf que le tableau final ne contient une ligne, stockant tous les résultats de calcul, avec comme valeur dans la colonne TRANCHE "tranche2".
Il semblerait que cette requête ne trouve pas de valeur comprise entre 1.01 et 1.10.