【问题标题】:SQL change a query from a specific user to all usersSQL 将查询从特定用户更改为所有用户
【发布时间】:2016-06-13 22:04:12
【问题描述】:

我使用 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

【问题讨论】:

  • 你能展示一些样本数据吗?请问结果是什么?
  • 我现在添加了一个例子。
  • 结果不会是 1/3 和 2/3 吗?还是您只是在寻找计数与不是该用户的所有计数?
  • 不,计算用户发送的消息与用户接收的消息。

标签: sql sql-server


【解决方案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;

【讨论】:

    【解决方案2】:

    您可以像这样重写您的查询:

    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 &lt;&gt; M.user_ID 行(这会产生 1/3 和 2/3)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-10-20
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多