2016-07-05 80 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