2016-01-07 50 views
0

我有以下SQL查询:SQL在双选择查询得到的双精度值

SELECT 
a.url, 
b.lpvs, 
a.volume, 
a.sales_usd, 
a.sales_eur, 
a.sales_gbp, 
a.sales_jpy 
FROM (
SELECT 
referer_trackings.cookie_first_url AS url, 
count(purchases.id) AS volume, 
SUM(CASE WHEN purchases.currency = 'USD' THEN purchases.price ELSE 0 END) AS sales_usd, 
SUM(CASE WHEN purchases.currency = 'EUR' THEN purchases.price ELSE 0 END) AS sales_eur, 
SUM(CASE WHEN purchases.currency = 'GBP' THEN purchases.price ELSE 0 END) AS sales_gbp, 
SUM(CASE WHEN purchases.currency = 'JPY' THEN purchases.price ELSE 0 END) AS sales_jpy 
FROM purchases 
JOIN referer_trackings 
ON referer_trackings.trackable_id = purchases.id 
JOIN items 
ON purchases.item_id = items.id 
WHERE items.seller_id = '6' 
AND referer_trackings.trackable_type = 'Purchase' 
AND purchases.workflow_state = 'payment_successful' 
GROUP BY referer_trackings.cookie_first_url 
ORDER BY volume DESC 
) AS a, (SELECT 
count(referer_trackings.id) AS lpvs 
FROM referer_trackings 
JOIN product_landing_page_views 
ON product_landing_page_views.id = referer_trackings.trackable_id 
JOIN items 
ON items.id = product_landing_page_views.item_id 
WHERE referer_trackings.trackable_type = 'ProductLandingPageView' 
AND items.seller_id = '6') 
AS b 

这收率这样的结果:

url lpvs volume sales_usd sales_eur sales_gbp sales_jpy 
======================================================================= 

url1 1082 3   9.99   9.99  9.99  0.0 
url2 1082 1   0.0   9.99  0.0   0.0 
     ^

的LPVS列的第二行(值:1082,用下面的小箭头)应该是0而不是1082.值1082只对第一行是正确的。

我知道这是由于加入/选择时翻倍的缘故,但我似乎无法摆脱这种困惑并让查询恰到好处。

我可以从我的ruby代码中调用两个查询并合并结果。这将是快速解决方案。不过,我想保持这个清洁,并去一个纯粹的SQL解决方案。我感觉我很亲密。

如果有人知道如何使用ActiveRecord来做到这一点,那也会很棒:-)。

谢谢你的时间!

=====基于拉胡尔的调整EDIT =====

这是查询的结果:

url lpvs volume sales_usd sales_eur sales_gbp sales_jpy 
======================================================================= 

url1 7  7   19.98  29.97  19.98  0.0 
url2 1  1   0.0   9.99  0.0   0.0 
    ^ ^  ^  ^  ^

^1, row 1 => value should be 1082 
^1, row 2 => value should be 0 
^2, row 1 => value should be 3 
^2, row 2 => value should be 1 
^3, row 1 => value should be 9.99 (current value is doubled somehow) 
^4, row 1 => value should be 9.99 (current value is tripled somehow) 
^5, row 1 => value should be 9.99 (current value is doubled somehow) 

回答

0

那是因为你的假低于我不是查询部分知道为什么你正在做的...

.... 
ORDER BY volume DESC 
) AS a, (SELECT 
count(referer_trackings.id) AS lpvs 
FROM referer_trackings 
........) 
AS b 

在你的主要选择你说

SELECT 
a.url, 
b.lpvs, <-- result of above posted query part 

是,修改你的整个查询要像下面

SELECT 
referer_trackings.cookie_first_url AS url, 
count(referer_trackings.id) AS lpvs, 
count(purchases.id) AS volume, 
SUM(CASE WHEN purchases.currency = 'USD' THEN purchases.price ELSE 0 END) AS sales_usd, 
SUM(CASE WHEN purchases.currency = 'EUR' THEN purchases.price ELSE 0 END) AS sales_eur, 
SUM(CASE WHEN purchases.currency = 'GBP' THEN purchases.price ELSE 0 END) AS sales_gbp, 
SUM(CASE WHEN purchases.currency = 'JPY' THEN purchases.price ELSE 0 END) AS sales_jpy 

FROM purchases 
LEFT JOIN referer_trackings ON referer_trackings.trackable_id = purchases.id 
AND referer_trackings.trackable_type IN ('Purchase', 'ProductLandingPageView') 
LEFT JOIN product_landing_page_views ON product_landing_page_views.id = referer_trackings.trackable_id 
LEFT JOIN items ON purchases.item_id = items.id AND items.seller_id = '6' 

WHERE purchases.workflow_state = 'payment_successful' 
GROUP BY referer_trackings.cookie_first_url 
ORDER BY volume DESC; 
+0

你是说,理想的结果是可能没有第二个查询? – Corstiaan

+0

@Corstiaan,是的,如果有帮助,请参阅编辑答案。 – Rahul

+0

谢谢:-)。但是,查询使lpvs列的值与卷列完全相同...... lpvs的值1082正确,但仅适用于第一行,而不是第二行。 – Corstiaan