如何使用自联接
根据枚举状态获取计数我有一个名为“student”的表,其中我使用enum作为状态0,1,2,其中0表示非活动状态,1表示活动状态,2表示已删除状态。
即
studentid studentenrollid studentname studentstatus
1 3 xyz 1
2 3 xyz 2
3 8 asda 1
4 7 sdd 1
5 9 asds 0
6 3 xyz 1
我需要根据studentrollid独特的状态获取计数。
studentrollid | inactive | active | deleted
3 0 2 1
8 0 1 0
7 0 1 0
9 1 0 0
答案 0 :(得分:1)
请试试这个:
select studentenrollid,
sum(case when studentstatus = 1 then 1
else 0 end) as Active,
sum(case when studentstatus = 0 then 1
else 0 end) as Inactive,
sum(case when studentstatus = 2 then 1
else 0 end) as Deleted
from demo
group by studentenrollid
;
| STUDENTENROLLID | ACTIVE | INACTIVE | DELETED |
-------------------------------------------------
| 3 | 2 | 0 | 1 |
| 7 | 1 | 0 | 0 |
| 8 | 1 | 0 | 0 |
| 9 | 0 | 1 | 0 |
select a.studentenrollid,
sum(a.studentstatus = 1) as Active,
sum(a.studentstatus = 0) as Inactive,
sum(a.studentstatus = 2) as Deleted
from demo a
group by a.studentenrollid
;
| STUDENTENROLLID | ACTIVE | INACTIVE | DELETED |
-------------------------------------------------
| 3 | 2 | 0 | 1 |
| 7 | 1 | 0 | 0 |
| 8 | 1 | 0 | 0 |
| 9 | 0 | 1 | 0 |
根据评论中给出的OP的创建陈述/插入陈述:
| STUDENTENROLLID | ACTIVE | INACTIVE | DELETED |
-------------------------------------------------
| 1 | 1 | 0 | 0 |
| 2 | 1 | 0 | 0 |
| 3 | 1 | 0 | 0 |
| 41 | 9 | 1 | 1 |
答案 1 :(得分:0)
您可以使用带有CASE
表达式的聚合函数来 pivot 数据:
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
结果是:
| STUDENTENROLLID | INACTIVE | ACTIVE | DELETED |
-------------------------------------------------
| 3 | 0 | 2 | 1 |
| 7 | 0 | 1 | 0 |
| 8 | 0 | 1 | 0 |
| 9 | 1 | 0 | 0 |
编辑#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 |
请注意,您只获得了已删除的计数,因为这是您在数据库中的唯一值(至少在示例数据中)。