您可以使用带有 CASE 表达式的聚合函数来透视数据:
select studentenrollid,
count(case when studentstatus = '0' then studentid end) InActive,
count(case when studentstatus = '1' then studentid end) Active,
count(case when studentstatus = '2' then studentid end) Deleted
from yourtable
group by studentenrollid
见SQL Fiddle with Demo。
结果是:
| STUDENTENROLLID | INACTIVE | ACTIVE | DELETED |
-------------------------------------------------
| 3 | 0 | 2 | 1 |
| 7 | 0 | 1 | 0 |
| 8 | 0 | 1 | 0 |
| 9 | 1 | 0 | 0 |
使用您放置在 cmets 中的示例数据编辑 #1:
CREATE TABLE IF NOT EXISTS demo
(
studentid int(11) NOT NULL AUTO_INCREMENT,
studentenrollid int(11) NOT NULL,
studentstatus enum('0','1','2') NOT NULL DEFAULT '1',
PRIMARY KEY (studentid),
KEY studentenrollid (studentenrollid)
) ENGINE=InnoDB DEFAULT CHARSET=latin1 AUTO_INCREMENT=84 ;
INSERT INTO demo (studentid, studentenrollid, studentstatus)
VALUES
(22, 41, '2'),
(23, 1,'1'),
(24, 2, '1'),
(25, 3, '1'),
(26, 41, '1'),
(29, 41, '1'),
(30, 41, '1'),
(31, 41, '1'),
(32, 41, '1'),
(33, 41, '1'),
(34, 41,'1'),
(35, 41, '1'),
(36, 41, '1'),
(37, 41, '1')
您的查询将是:
select studentenrollid,
count(case when studentstatus = '0' then studentid end) InActive,
count(case when studentstatus = '1' then studentid end) Active,
count(case when studentstatus = '2' then studentid end) Deleted
from demo
group by studentenrollid
结果(见SQL Fiddle with Demo):
| STUDENTENROLLID | INACTIVE | ACTIVE | DELETED |
-------------------------------------------------
| 1 | 0 | 1 | 0 |
| 2 | 0 | 1 | 0 |
| 3 | 0 | 1 | 0 |
| 41 | 0 | 10 | 1 |
请注意,您只会得到一个已删除的计数,因为这是您在数据库中拥有的唯一值(至少在示例数据中)。