SQL将查询从特定用户更改为所有用户

时间:2016-06-13 22:04:13

标签: sql sql-server

我使用sql server,我有表:

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

2 个答案:

答案 0 :(得分: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;

答案 1 :(得分: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)。