2009-04-12 21 views
3

J'essaye de trouver une requête pour rapporter des revenus. Il faudra 2 tables: clics et offres. Le chiffre d'affaires est calculé par le nombre de conversions * commission pour l'offre. Les conversions sont stockées dans la table des clics dans un champ appelé "conversionDate" et la commission pour chaque offre est enregistrée dans la table des offres.requête sql avec if statment

La requête doit comporter une condition pour ignorer les clics qui n'ont pas été convertis (ce qui signifie que conversionDate est NULL) lors de l'addition des revenus de l'offre.

Ce que j'ai besoin d'un peu de peaufinage car il ne donne pas la valeur correcte pour les recettes:

SELECT offre o.name, compter (c.id) clics, si (non isNull (c. conversionDate), revenus = revenus + o.commission, revenus) revenus FROM clics c, offres o où c.offerID = o.ID GROUP BY o.ID;

J'ai actuellement 3 enregistrements fictifs dans les clics, dont 2 sont des conversions. Avec la commission fixée à 1, le revenu devrait être 2. Le résultat que je reçois est 1. Suis-je sur la bonne voie ou le calcul des recettes devrait-il être une sorte de sous-requête ou quoi?

Répondre

6

J'écrirait la requête de cette façon:

SELECT o.name AS offer, COUNT(c.id) AS clicks, 
    SUM(IF(c.conversionDate IS NOT NULL, o.commission, NULL)) AS revenue 
FROM offers o JOIN clicks c ON (c.offerID=o.ID) 
GROUP BY o.ID; 

Voici une autre solution, mais les offres qui n'ont pas clics convertis ne sont pas montrées dans e résultat de la requête:

SELECT o.name AS offer, COUNT(c.id) AS clicks, 
    SUM(o.commission) AS revenue 
FROM offers o JOIN clicks c 
    ON (c.offerID=o.ID AND c.conversionDate IS NOT NULL) 
GROUP BY o.ID; 
+0

La première requête est ce dont j'avais besoin. Merci beaucoup! –

0

déplacer le chèque nul à la clause WHERE

+0

Cela fonctionnerait pour cet exemple spécifique, mais la requête que j'utilise actuellement contient beaucoup plus d'informations; Je ne peux pas exclure les clics qui n'ont pas été convertis, car cela gâcherait les autres données. –

+0

@ [wbgriffin]: le diviser en 2 sous/requêtes, ou poster le vrai; ne peut pas répondre aux questions avec précision en utilisant des exemples incomplets/trompeurs ;-) –

0

Essayez cette requête:

SELECT o.name offer, COUNT(c.id) clicks, IF(c.conversionDate IS NULL, revenue + o.commission, revenue) revenue 
FROM clicks c, offers o 
WHERE c.offerID=o.ID 
GROUP BY o.ID; 
+0

même résultat que ma requête originale .. –

0
SELECT o.name offer, count(*) clicks, (COUNT(c.ID) * o.commission) revenue 
FROM clicks c, offers o 
WHERE c.ConversionDate is not null and c.offerID=o.ID 
GROUP BY o.ID, o.name, o.commission;