我使用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
答案 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)。