2009-04-12 161 views
3

我想要拿出一个查询来报告收入。它将需要2个表格:点击和优惠。收入是根据报价的转化次数*佣金计算的。转化数据存储在名为“conversionDate”的字段中的点击表格中,每个要约的佣金都存储在要约表中。SQL查询与if语句

查询中需要有一个条件才能忽略在为报价添加收入时未转换的任何点击(意思是conversionDate为NULL)。

我有什么需要一点调整,因为它是不是给正确的价值收入:

SELECT o.name报价,计数(c.id)点击,如果(不ISNULL(C。 conversionDate),收入=收入+ o.commission,收入)收入点击c,offer o其中c.offerID = o.ID GROUP BY o.ID;

我现在有3个虚拟记录点击,其中2个是转换。将佣金设置为1,收入应该是2.我得到的结果是1.我是在正确的轨道上还是应该计算收入是某种子查询还是什么?

回答

6

我会写的查询是这样的:

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; 

这里的另一种解决方案,但没有任何转化点击的优惠不会显示在第e查询结果:

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

举动空校验WHERE子句

+0

这将适用于这个特定的例子,但我实际使用的查询有更多的信息;我无法排除未转换的点击,因为这会弄乱其他数据。 – 2009-04-12 22:04:53

+0

@ [wbgriffin]:将它分成2个子/查询,或张贴真实的东西;不能使用不完整/误导性示例准确回答问题;-) – 2009-04-12 22:12:30

0

尝试此查询:

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

与我原始查询的结果相同。 – 2009-04-12 22:07:07

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;