简体   繁体   English

SQL Server查询+联接结果

[英]SQL Server query + joining results

I have a query like this: 我有这样的查询:

SELECT recipientid AS ID,
COUNT(*) AS Recieved FROM Inbox
GROUP BY recipientid

UNION

SELECT SenderId,
COUNT(*) AS [Sent] FROM Inbox
GROUP BY SenderId

The output: 输出:

RecipientID  Recieved

001             3
001             4
002             4
002             2
003            18
003            55

How can I rewrite is such a way that it displays like this: 我该如何重写,因此显示如下:

RecipientID  Recieved  Sent

001             3       4
002             4       2
003            18       55

Thanks. 谢谢。

Just join the subqueries: 只需加入子查询:

select a.ID,Received,Sent
from(
  SELECT recipientid AS ID,
  COUNT(*) AS Recieved FROM Inbox
  GROUP BY recipientid
)a
full outer join(
  SELECT SenderId as ID,
  COUNT(*) AS [Sent] FROM Inbox
  GROUP BY SenderId
)b
on (a.ID = b.ID)
order by a.ID;

Note that this grabs all of the sent and received values for any recipients or senders. 请注意,这sent获取所有收件人或发件人的所有已sent和已received值。 If you only want results for ID s belonging to recipients and senders, then do an inner join . 如果您只想要ID属于接收者和发送者的结果,请执行一个inner join

I would add a source column to your query and do a simple pivot 我将source列添加到您的查询并做一个简单的枢轴

select ID, 
       max (case when source=1 then Cnt else 0 end) as Received,
       max (case when source=2 then Cnt else 0 end) as Sent
from (
  SELECT 1 as Source, 
         recipientid AS ID,
         COUNT(*) AS Cnt 
  FROM Inbox
  GROUP BY recipientid
  UNION
  SELECT 2 as Source, 
         SenderId,
         COUNT(*)  
  FROM Inbox
  GROUP BY SenderId
  ) x
GROUP BY ID

If it's Postgres, MS SQL or others that support CTEs - 如果是Postgres,MS SQL或其他支持CTE的人-

With Both as
(
SELECT
  recipientid AS ID,
  Count(*) AS Recieved,
  0 as [Sent] 
FROM Inbox
GROUP BY recipientid
UNION
SELECT
  SenderId as ID,
  0 as Recieved,
  Count(*) AS [Sent]
FROM Inbox
GROUP BY SenderId
)
SELECT
  ID,
  Sum(Received) as [Received],
  Sum(Sent) as [Sent]
FROM BOTH
GROUP BY ID
ORDER BY 1

Assuming you have a users table with the IDs, you could do something like: 假设您有一个包含ID的users表,则可以执行以下操作:

SELECT
    users.id,
    COUNT(sent.senderid) AS sent,
    COUNT(received.recipientid) AS received
FROM
    users
    LEFT JOIN inbox AS sent ON sent.senderid = users.id
    LEFT JOIN inbox AS received ON received.recipientid = users.id
GROUP BY sent.senderid, received.recipientid
ORDER BY users.id;

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM