2016-06-13 89 views
1

我使用SQL Server和我有表:SQL從特定用戶的查詢更改爲所有用戶

tbl_Message: 
id, user_id, group_id 

這是一個包含所有的消息是誰寫的消息的詳細信息表(USER_ID)且其中組被髮送(GROUP_ID)

tbl_GroupUser: 
user_id, group_id 

其是包含用戶和他們在(每個組具有一個以上的USER_ID和每個用戶具有一個以上的基團)基團的表。

我創建了一個查詢,返回用戶發送的消息與他收到的消息之間的比率。我做了一個適用於特定用戶的查詢,並且我想要一個顯示所有用戶結果的查詢。這是我提出的查詢:

SELECT CAST((SELECT COUNT(*) FROM tbl_Message WHERE user_id = ‘user’) 
as decimal)/
(SELECT COUNT(*) FROM tbl_Message WHERE group_id in 
(SELECT group_id FROM tbl_GroupUser WHERE user_id = ‘user’) and user_id != ‘user’) 

例子:

tbl_GroupUser

user_id | group_id 
------------------- 
1  | 1 
2  | 1 

tbl_Message

id | user_id | group_id 
----------------------- 
1 | 1  | 1 
2 | 2  | 1 
3 | 2  | 1 

返回結果:

user_id | ratio 
--------------- 
1  | 1/2 
2  | 2/1 
+0

你會顯示一些樣本數據,並從中得出什麼結果? –

+0

我現在增加了一個例子。 –

+0

結果不會是1/3和2/3嗎?或者你只是在尋找計數與所有不是該用戶的計數? – ZLK

回答

1

讓我假設你有一個users表。

select u.*, s.num_sent, r.num_received, 
     s.num_sent/nullif(r.num_received, 0) as ratio 
from users u left join 
    (select user_id, count(*) as num_sent 
     from tbl_Message m 
     group by user_id 
    ) s 
    on s.user_id = u.user_id left join 
    (select gu.user_id, count(*) as num_received 
     from tbl_Message m join 
      tbl_GroupUser gu 
      on m.group_id = gu.group_id 
     group by gu.user_id 
    ) r 
    on r.user_user = u.user_id; 
+0

它的作品!謝謝 :) –

0

你可以重寫查詢是這樣的:

SELECT user_ID, 1.0 * A.B/COUNT(*) 
FROM tbl_Message M 
CROSS APPLY (
    SELECT COUNT(*) 
    FROM tbl_Message 
    WHERE group_ID IN (
     SELECT group_ID 
     FROM tbl_GroupUser 
     WHERE user_ID = M.user_ID) 
    AND user_ID <> M.user_ID) A(B) 
GROUP BY user_ID, A.B 
ORDER BY user_ID; 

另外,如果你想整體的實際金額,這將是1.0 * COUNT(*)/A.B和刪除行AND user_ID <> M.user_ID(這將產生1/3和2/3)。