1

如何使用自加入根据枚举状态获取计数

我有一个名为“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
4

2 回答 2

1

请试试这个:

SQLFIDDLE 演示

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 |

MYSQL 5.1.61 版本查询


基于评论中给出的 OP 的 create statment/insert 语句:

SQLFIDDEL 演示 2

| STUDENTENROLLID | ACTIVE | INACTIVE | DELETED |
-------------------------------------------------
|               1 |      1 |        0 |       0 |
|               2 |      1 |        0 |       0 |
|               3 |      1 |        0 |       0 |
|              41 |      9 |        1 |       1 |
于 2013-01-29T17:18:19.503 回答
0

You can use an aggregate function with a CASE expression to pivot the data:

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

See SQL Fiddle with Demo.

The result is:

| STUDENTENROLLID | INACTIVE | ACTIVE | DELETED |
-------------------------------------------------
|               3 |        0 |      2 |       1 |
|               7 |        0 |      1 |       0 |
|               8 |        0 |      1 |       0 |
|               9 |        1 |      0 |       0 |

Edit #1, using the sample data that you placed in the comments:

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') 

Your query would be:

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

With the result (See SQL Fiddle with Demo):

| STUDENTENROLLID | INACTIVE | ACTIVE | DELETED |
-------------------------------------------------
|               1 |        0 |      1 |       0 |
|               2 |        0 |      1 |       0 |
|               3 |        0 |      1 |       0 |
|              41 |        0 |     10 |       1 |

Note, you are only getting a deleted count because that is the only value that you have in your data base (at least in the sample data).

于 2013-01-29T17:12:05.673 回答