我必须与blow结构表
- meetingID
- meetingDate
- meetingTitle
meetingsion 参加会议的人
- id
- meetingID
- personID
- IsPresent位
,下面是测试
的示例行会议表行
- meetingID:1—2010/05/05—MeetingX
- meetingID:2—2010/05/07—MeetingY
MeetingPerson Table Rows
MeetingID:2
PersonID:1
IsPresent:true
MeetingID:2
PersonID:2
IsPresent:true
MeetingID:2
PersonID:3
IsPresent:false
MeetingID:2
PersonID:4
IsPresent:null
我需要查询显示在报告中,我需要有这个结果与样本日期,报告的标题
MeetingTitle | NumberOfPresent | NumberOfAbsents
示例数据的结果应该是这样的
Title:MeetingX | NumberOfPresent:0 | NumberOfAbsents:0
Title:MeetingY | NumberOfPresent:2 | NumberOfAbsents:1
Try
SELECT m.MeetingTitle,
SUM(CASE WHEN p.IsPresent = 1 THEN 1 ELSE 0 END) NumberOfPresent,
SUM(CASE WHEN p.IsPresent = 0 THEN 1 ELSE 0 END) NumberOfAbsents
FROM Meeting m LEFT JOIN MeetingPerson p
ON m.meetingID = p.meetingID
GROUP BY m.meetingID
输出:| MEETINGTITLE | NUMBEROFPRESENT | NUMBEROFABSENTS |
----------------------------------------------------
| MeetingX | 0 | 0 |
| MeetingY | 2 | 1 |
这里是SQLFiddle demo
请尝试一下。
SELECT M.MEETINGTITLE, SUM(CASE WHEN ISPRESENT ISNULL THEN 0 ELSE 1) NumberOfPresent , SUM(CASE WHEN ISPRESENT ISNULL THEN 1 ELSE 0) AS NOOFABSENTEES
FROM MEETING M INNER JOIN MEETINGPERSON P
WHERE M.MEETINGID=P.MEETINGID
GROUP BY M.MEETINGTITLE
谢谢。
您也可以使用以下动态查询:
SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'SUM(case when `IsPresent` = ',
`IsPresent`,
' then 1 ELSE 0 END) AS `IsPresent_',
`IsPresent`, '`'
)
) INTO @sql
FROM MeetingPerson;
SET @sql = CONCAT('SELECT meetingTitle, ', @sql, '
FROM Meeting
LEFT JOIN MeetingPerson
ON Meeting.meetingID = MeetingPerson.MeetingID
GROUP BY meetingTitle
');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
结果:╔══════════════╦═════════════╦═════════════╗
║ MEETINGTITLE ║ ISPRESENT_1 ║ ISPRESENT_0 ║
╠══════════════╬═════════════╬═════════════╣
║ MeetingX ║ 0 ║ 0 ║
║ MeetingY ║ 2 ║ 1 ║
╚══════════════╩═════════════╩═════════════╝
查看SQLFiddle
SELECT
m.meetingtitle
,SUM(CASE WHEN i.ispresent = 1 THEN 1 ELSE 0 END) AS numberofabsents
,SUM(CASE WHEN i.ispresent = 0 THEN 1 ELSE 0 END) AS numberofabsents
FROM
meeting m
LEFT OUTER JOIN meetingperson i on i.meetingid = m.meetingid
GROUP BY
m.meetingtitle