2013-04-20 44 views
0

我有這個表時的記錄,至少有一半是被評價的選擇數據「Y」

evaluation([id_member, id_article], opinion) 

我試圖選擇id_article而成員中至少有一半爲「Y」設置的意見。

例如:

(1, 1, NULL) 
(2, 1, NULL) 
(1, 2, NULL) 
(2, 2, 'Y') 

查詢應選擇,因爲在兩排中的一個第2(用於第二物品)包含一個「Y」。

我找不到如何操作!

[]意味着id_memberid_article組成主鍵。

+0

「views」列是「NUMBER」還是「VARCHAR2」?你的樣本數據是數字的,你的問題的文本是關於一個字符的字符串('Y'或'N'),而你的問題的主題是關於多個字符的字符串,比如'Yes'。哪三個是正確的? – 2013-04-20 22:47:14

+0

我已經看過我的代碼了。 「意見」是「Y」或「NULL」 – mpluse 2013-04-20 22:53:17

+0

好的。那麼你可以更新你的樣本數據嗎? – 2013-04-20 22:55:59

回答

5

如果意見是字符串:

SELECT id_article 
FROM 
Evaluation 
GROUP BY id_article 
HAVING 
AVG(CASE OPINION WHEN 'Y' THEN 1.0 ELSE 0.0 END) >= 0.5 

如果意見是小數(假設0.0或1.0),然後

SELECT id_article 
FROM 
Evaluation 
GROUP BY id_article 
HAVING 
AVG(Opinion) >= 0.5 

如果意見是整數(假設0或1),然後

SELECT id_article 
FROM 
Evaluation 
GROUP BY id_article 
HAVING 
AVG(Opinion*10) >= 5 
+0

非常感謝:) – mpluse 2013-04-20 23:02:05

+0

只有一個問題:我可以使用'AND id_article IN'其他SELECT?對不起,我沒有dbms來測試。 – mpluse 2013-04-20 23:04:30

+0

不,你必須做的是在where子句中......表名後 和GROUP BY子句之前然後寫 WHERE id_article IN(SELECT ...) 然而,在大多數情況下,我會推薦使用 WHERE EXISTS(SELECT * FROM sometable where wheretable.id_Article = Evaluation.id_Article) – 2013-04-20 23:06:53

0

這是使用having子句的絕好機會。

select blah, blah, blah 
from evaluation join other tables as required 
where whatever 
having (sum(opinion)/count(*)) * 100 > 50 
+0

'group by'在哪裏?分數是倒置的。 – 2013-04-20 22:53:22

+0

我可以使用'group by'嗎? – mpluse 2013-04-20 22:53:56

+0

同一問題@EgorSkriptunoff – mpluse 2013-04-20 22:54:13

0

下面是一個方法,用於效率使用低估的ratio_to_report()分析函數獲取整行:

select 
    id_member, 
    id_article, 
    opinion 
from 
    (select id_member, 
      id_article, 
      opinion, 
      ratio_to_report(case when opinion 'Y' then 1 else 0 end) 
      over (partition by id_article) rtr 
    from evaluation) 
where 
    rtr >= 0.5; 
相關問題