2016-01-23 1 views
0

Je cherche à faire la différence entre 2 sommes cumulées et triées par date, mais la colonne date est sur une table différente de la date qui semble poser problème. (date figure dans la table eventinfo et les colonnes que je souhaite utiliser figurent dans le tableau results).Tri séquentiel cumulatif SQLite

Je veux obtenir un total cumulatif sur la différence entre results.prize et results.totalbuyin avec le total commandé par eventinfo.dateresults.event=eventinfo.eventname. Je voudrais également filtrer la requête par results.playername afin que je puisse obtenir un total cumulatif pour n'importe quel joueur individuel. Je peux obtenir la colonne de date à apparaître dans la requête et par ordre chronologique, mais somme qui se passe dans l'ordre de numéro d'identification:

Résultats Tableau

ID;PlayerName;TotalBuyIn;Prize;Rebuys;Event; 
1;Ole Schemion;100000;1062785;0;Aria $100K July 2014; 
2;Isaac Haxton;100000;813394;0;Aria $100K July 2014; 
3;Daniel Colman;100000;796821;0;Aria $100K July 2014; 
4;Daniel Cates;100000;297000;0;Aria $100K July 2014; 
5;Cary Katz;100000;0;0;Aria $100K July 2014; 

EventInfo Tableau

ID;EventName;Date;Location;Country;PokerTour;UniquePlayers;Rebuys; 
1;ACOP 500k 2014;2014-11-01;City of Dreams;Macau;APPT;52;50; 
2;ACOP Super High Roller 2015;2015-11-13;City of Dreams;Macau;APPT;34;17; 
3;Alpha 8 Florida 2013;2013-08-26;Seminole Hard Rock;USA;WPT;18;3; 
4;Alpha 8 Florida 2015;2015-01-17;Seminole Hard Rock;USA;WPT;6;0; 
5;Aria $100K July 2014;2014-02-14;Emperor Palace;South Africa;WPT;9;1; 

Dans ces tableaux results.event=eventinfo.eventname

Failed Recherche

SELECT t1.id, 
    t1.prize, 
    t1.TotalBuyIn, 
    t1.PlayerName, 
    (SUM(t2.prize)) - (SUM(t2.totalbuyin)), 
    eventinfo.Date 
FROM results t1 
INNER JOIN results t2 ON t1.id >= t2.id and t2.PlayerName = "Erik Seidel" 
INNER JOIN eventinfo ON t1.Event = eventinfo.EventName 
Where t1.PlayerName = "Erik Seidel" 
GROUP BY t1.id 
ORDER BY eventinfo.Date 

Courant de sortie

t1.id;t1.prize;t1.TotalBuyIn;t1.PlayerName;(SUM(t2.prize)) - (SUM(t2.totalbuyin));eventinfo.Date; 
1314;618139;98902;Erik Seidel;135685;2011-01-22; 
1292;2472555;247255;Erik Seidel;-383552;2011-01-27; 
1401;1092780;100000;Erik Seidel;1128465;2011-05-18; 
1425;0;100000;Erik Seidel;1028465;2011-12-09; 
1127;0;100000;Erik Seidel;-2341985;2012-01-05; 

ligne 8 est évidemment le problème mais je ne peux pas sembler réécrire le code pour le corriger. Mettre en t1.date>=t2.date ne fonctionnera pas même si je pensais avoir rejoint les tables. J'utilise SQLite3 si cela fait une différence.

+0

Je vous suggère de modifier votre question pour inclure des données d'échantillon et les résultats souhaités. Une requête qui ne fonctionne pas n'est souvent pas suffisante pour communiquer ce que l'on veut faire à d'autres personnes qui ne connaissent pas le problème. –

+0

Si eventinfo.EventName est un champ Char, il serait probablement judicieux d'ajouter une colonne ID unique à la table eventinfo. L'utilisation de colonnes de texte pour les clés n'est généralement pas recommandée. –

+0

À quoi sert la colonne results.id? À première vue, il semble être un UID, mais vous l'utilisez comme s'il s'agissait d'une valeur qui appartient au lecteur. Est-ce que la table des résultats comporte plusieurs rangées par joueur? –

Répondre

0

Je crée la première requête comme ceci:

SELECT Date, EventName, (SUM(Prize)) - (SUM(TotalBuyIn)) AS Net 
FROM results 
INNER JOIN eventinfo ON Event = EventName 
GROUP BY Date, EventName 
ORDER BY eventinfo.Date 

Je voudrais créer la deuxième requête comme ceci:

SELECT PlayerName, (SUM(Prize) - SUM(TotalBuyIn)) AS Net, Date, EventName 
FROM Results 
INNER JOIN EventInfo ON Event = EventName 
GROUP BY PlayerName 
ORDER BY Date 

Voici une astuce: Vous avez créé un entier clé primaire (ID) dans la table EventInfo et il est recommandé d'utiliser ces valeurs entières dans la colonne Event de la table Results. L'utilisation de valeurs de texte pour joindre des tables peut créer des maux de tête inutiles. La solution suivante ne fonctionne que pour un joueur, mais vous avez spécifié un lecteur spécifique dans votre exemple, donc je crois que c'est ce que vous cherchez.

CREATE TEMPORARY TABLE TEMP AS SELECT Date, PlayerName, Prize, TotalBuyIn, SUM(t1.Prize - T1.TotalBuyIn) AS Net 
FROM Results t1 
INNER JOIN EventInfo t3 ON t1.Event = t3.EventName 
GROUP BY t1.PlayerName, t3.Date; 

SELECT Date, PlayerName, Prize, TotalBuyIn, 
(SELECT SUM(Net) FROM TEMP t2 WHERE t1.Date >= t2.Date AND PlayerName='Erik Seidel') AS Net 
FROM TEMP t1 
WHERE PlayerName='Erik Seidel' 
GROUP BY Date 
ORDER BY Date; 

DROP TABLE TEMP; 
+0

Merci pour votre réponse, –

+0

Merci pour votre réponse, mais ne semble pas être ce que je cherche, probablement parce que je ne l'ai pas expliqué correctement. Je voudrais un total cumulé pour ('results.prize' - 'results.totalbuyin') pour chaque 'results.event' d'un joueur particulier, dans l'ordre de la date pour ce joueur. Si vous voyez dans ma question, la sortie dans mon qurey est proche de ce que je veux mais le total courant est dans l'ordre de 'results.id' au lieu de 'eventinfo.date' ce qui est ce que je veux. Merci pour l'astuce sur l'utilisation de la clé primaire dans d'autres tables, est tout à fait logique maintenant je le regarde. –

+0

ne peut toujours pas vraiment l'expliquer correctement, le total cumulé dans mon exemple de requête, bien que trié par date, le total cumulé est calculé comme s'il était ordonné dans 'results.id' order –