在double select查询中生成双值的sql
我有以下sql查询:在double select查询中生成双值的sql,sql,ruby-on-rails,postgresql,activerecord,Sql,Ruby On Rails,Postgresql,Activerecord,我有以下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
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来实现这一点,那也太好了:-)
谢谢你的时间
======编辑=====
根据Rahul的调整,这是查询的结果:
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)
这是因为你的虚假下面的查询部分,我不知道你为什么要这样做
....
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
您是说不需要第二次查询就可以得到所需的结果吗?谢谢:-)。但是,您的查询使lpvs列的值与volume列的值完全相同。。。lpvs的值1082是正确的,但仅适用于第一行,而不是第二行。我复制了您的查询。请参见原始问题中的我的编辑
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;