2016-06-13 87 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)。