繁体   English   中英

SQL-在一个查询上显示3个不同的计数

[英]SQL - Displaying 3 different counts on one query

这三个查询各自独立工作。 但是,我希望所有三个COUNTS都显示在同一查询中。 它们相同,除了WHERE语句中的细微差别。

/* Display Total Message Count */
SELECT People.Name, COUNT(Messages.SenderID) as "Total Messages Sent"
FROM Ballers.Messages JOIN Ballers.People
WHERE Messages.SenderID = People.ID
GROUP BY People.Name;

/* Display Text Message Count */
SELECT People.Name, COUNT(Messages.SenderID) as "Text Messages Sent"
FROM Ballers.Messages JOIN Ballers.People
WHERE Messages.SenderID = People.ID AND Type = "Text"
GROUP BY People.Name;

/* Display Picture Message Count */
SELECT People.Name, COUNT(Messages.SenderID) as "Picture Messages Sent"
FROM Ballers.Messages JOIN Ballers.People
WHERE Messages.SenderID = People.ID AND Type = "Picture"
GROUP BY People.Name;

我在同一表上输出所有三个查询都没有成功。 我尝试了很多不同的方法,但是都给了我错误。 我对SQL还是很陌生,但我还没有完全掌握一切的工作原理。 这是失败代码的一个示例:

/* Display All Message Counts, 3 Queries In One */
SELECT 
People.Name, 
(COUNT(Messages.SenderID) as "Messages Sent"
WHERE Messages.SenderID = People.ID),
(COUNT(Messages.SenderID) as "Text Messages Sent"
WHERE Messages.SenderID = People.ID AND Type = "Text"), 
(COUNT(Messages.SenderID) as "Picture Messages Sent"
WHERE Messages.SenderID = People.ID AND Type = "Picture")
FROM Ballers.Messages JOIN Ballers.People
GROUP BY People.Name;

尚未对此进行测试,但应遵循以下原则:

SELECT People.Name,
COUNT(*) AS AllMessages,
SUM(CASE WHEN Type='Text' THEN 1 ELSE 0 END) AS TextMessages,
SUM(CASE WHEN Type='Picture' THEN 1 ELSE 0 END) AS PictureMessages
FROM Ballers.Messages JOIN Ballers.People ON People.ID=Messages.SenderID
GROUP BY People.Name

您可以尝试这样的事情:

SELECT
 `People1`.`Name`,
 COUNT(`Messages1`.`SenderId`) as `TotalMessagesSent`,
 COUNT(`Messages2`.`SenderId`) as `TextMessagesSent`,
 COUNT(`Messages3`.`SenderId`) as `PictureMessagesSent`
FROM
 `Messages` as `Messages1`
 JOIN `People` as `People1` ON (`Messages1`.`SenderId` = `People1`.`ID`),
 `Messages` as `Messages2`
 JOIN `People` as `People2` ON (`Messages2`.`SenderId` = `People2`.`ID` AND `Type`='Text'),
`Messages` as `Messages3`
 JOIN `People` as `People3` ON (`Messages3.`SenderId` = `People3`.`ID` AND `Type`='Pictures')
GROUP BY
 `People1`.`Name`

或仅从人员表中选择并加入消息:

SELECT
 `People`.`Name`,
 COUNT(`Messages1`.`SenderId`) as `TotalMessagesSent`,
 COUNT(`Messages2`.`SenderId`) as `TextMessagesSent`,
 COUNT(`Messages3`.`SenderId`) as `PictureMessagesSent`
FROM
 `People`
 JOIN `Messages` as `Messages1` ON (`Messages1`.`SenderId` = `People`.`ID`)
 JOIN `Messages` as `Messages2` ON (`Messages2`.`SenderId` = `People`.`ID` AND `Type`='Text')
 JOIN `Messages` as `Messages3` ON (`Messages3.`SenderId` = `People`.`ID` AND `Type`='Pictures')
GROUP BY
 `People`.`Name`

也许它不完整,没有经过测试。

暂无
暂无

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

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