2013-03-15 100 views
1

我有这样的查询:SQL Server查询+加盟结果

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

UNION 

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

输出:

RecipientID Recieved 

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

我怎么可以重写是这样一种方式,它显示是这样的:

RecipientID Recieved Sent 

001    3  4 
002    4  2 
003   18  55 

谢谢。

+1

请指定你是目标的RDBMS通过添加适当的标签(Oracle,SQL Server,MySQL等)。可能会有利用不被普遍支持的语言或产品功能的答案。此外,通过使用特定的RDBMS标记它,您的问题可能会得到更适合回答的人的关注。 – Taryn 2013-03-15 18:27:19

回答

3

刚加入的子查询:

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; 

注意,这抓住所有的sentreceived值的任何收件人或发件人。如果您只想要ID属于收件人和发件人的结果,请执行inner join

+0

您希望这是一个完整的外连接,而不是内连接,否则您只会收到发送和接收消息的收件人。 – MattW 2013-03-15 18:26:22

+0

@MattW - 好的电话(虽然这个问题并不完全清楚)。 Lemme编辑... – 2013-03-15 18:26:52

+0

ID在第一个选择行中不明确。 – KekuSemau 2013-03-15 18:27:28

0

如果它的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 
2

我会一个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 
+1

我可能会建议使用'SUM'而不是'MAX'。 – Taryn 2013-03-15 18:28:36

+0

我想过了,这通常是我所做的(SUM而不是MAX),但内部的两个查询无论如何都是分组的,所以它是安全的......但它可能更清晰......另外,我甚至不需要内心小组 – alzaimar 2013-03-15 18:29:55

0

假设你有一个users表与ID,你可以做这样的事情:

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;