2016-07-05 76 views
-1

结果的部门我有一个表是这样的:加入两个子查询,有一个领域:两个子查询

userid | trackid | path 
    123  70000  ad 
    123  NULL  abc.com 
    123  NULL  Apply 
    345  70001 Apply 
    345  70001 Apply 
    345  NULL  Direct 
    345  NULL  abc.com 
    345  NULL  cdf.com 

而且我想这样的查询。当path ='abc.com'时,num_website +1;当路径= '应用',num_apply +1

userid | num_website | num_Apply | num_website/num_Apply 
    123   1   1    1 
    345   1   2   0.5 

我的语法如下:

select * from 
(select userid,count(path) as is_CWS 
from TABLE 
where path='abc.com' 
group by userid 
having count(path)>1) a1 
JOIN 
(select userid,count(userid) as Apply_num from   
where trackid is not NULL 
group by userid) a2 
on a1.userid=a2.userid 

我的问题是 1.如何让外地num_website/num_apply在我的语法项以上? 2.是否有其他更简单的方法来获得我想要的结果?

任何分享的景点都会很感激。

+0

什么是列别名“is_CWS”?或者它是num_website? where子句“track_id不为空”适用于查询的顶部(别名为a1)?看看我的查询有什么不同 – objectNotFound

+0

你没有主键。这可能会在适当的时候证明问题 – Strawberry

回答

0

这样做会改变选择线的最简单方法:

SELECT a1.userid, a1.is_CWS, a2.Apply_num, a1.is_CWS/a2.Apply_num FROM (select userid,count(path) as is_CWS from TABLE where path='abc.com' group by userid having count(path)>1) a1 JOIN (select userid,count(userid) as Apply_num from TABLE where trackid is not NULL group by userid) a2 on a1.userid=a2.userid

和然后继续完成其余的查询。明星的意思是“选择一切”。如果你只想选择一些东西,你只需要列出那些东西来代替明星,如果你想根据这些东西选择一些其他的值,你也可以把它们放在星星中。在这种情况下,a1.is_CWS/a2.Apply_num是一个表达式,MySql知道如何根据a1.is_CWS和a2.Apply_num的值对其进行评估。

同样,您可以在单个表达式而不是子查询中完成那些子查询所做的大量工作。 objectNotFound有正确的想法。您可以选择SUM(path="abc.com") as Apply_num而不必通过子查询来检索具有特定属性的行数,而无需再加入。做出这样的转变给我们:

SELECT a1.userid, SUM(path="abc.com") as is_CWS, a2.Apply_num, is_CWS/a2.Apply_num FROM TABLE JOIN (select userid,count(userid) as Apply_num FROM TABLE where trackid is not NULL group by userid) a2 on a1.userid=a2.userid GROUP BY userid

通知我感动的GROUP BY到查询的末尾。还要注意的不是引用a1.is_CWS我现在引用只是is_CWS(它不再是A1子表里面,所以我们可以直接引用它)

你可以做其他的子查询同样的事情,那么他们可以共享GROUP BY子句和你不再需要加入。

+0

你的解释对我来说很有意义,而且它现在可行。对于你提到的第二种方式,它不适用于我的数据库。有重复的问题。我猜可能我在使用PostgreSql的红移。另一个问题是,如果你也熟悉Redshift中的Postgresql,你知道如何以十进制格式显示分区吗? –

-1

让你开始...你可以建立在此之上:

select 
userid, 
SUM(CASE WHEN path='abc.com'then 1 else 0 end) as num_website, 
SUM(CASE WHEN path='Apply' and trackid is not NULL then 1 else 0 end) as Apply_Num 
from TABLE 
WHERE path='abc.com' or path='Apply' -- may not need this ... play with it 
group by userid 
+0

请解释downvote的原因,以便我们可以解决问题......(谁做到了这一点)thx。 – objectNotFound