【问题标题】:SQL Group By statusSQL 按状态分组
【发布时间】:2017-09-19 13:10:52
【问题描述】:

我正在寻找一种按状态对数据进行分组的方法。我有一个简单的选择,只是为了演示:

SQL Fiddle

MS SQL Server 2014 架构设置

CREATE TABLE Projects ([ID] int, [Project] varchar(10));
INSERT INTO Projects ([ID], [Project])
VALUES
    (1, 'Admin'),
    (2, 'Accounts'),
    (3, 'Finance')
;

CREATE TABLE Tasks ([ID] int, [ProjectID] int, [Task] int, [Status] varchar(8));
INSERT INTO Tasks
    ([ID], [ProjectID], [Task], [Status])
VALUES
    (1, 1, '001', 'Open'),
    (2, 1, '002', 'Canceled'),
    (3, 1, '003', 'Canceled'),
    (4, 1, '004', 'Canceled'),
    (5, 2, '005', 'Rejected'),
    (6, 2, '006', 'Canceled'),
    (7, 2, '007', 'Canceled'),
    (8, 3, '008', 'Canceled'),
    (9, 3, '009', 'Canceled'),
    (10, 3, '010', 'Canceled'),
    (11, 3, '011', 'Canceled'),
    (12, 3, '0012', 'Rejected')
;

查询 1

SELECT
  Projects.Project,
  COUNT(Tasks.Status) AS Total
FROM
  Projects
  LEFT JOIN Tasks ON Projects.ID = Tasks.ProjectID
 GROUP BY
   Projects.Project

Results

|  Project | Total |
|----------|-------|
| Accounts |     3 |
|    Admin |     4 |
|  Finance |     5 |

但我正在寻找一种输出方式:

|  Project | Open | Canceled | Rejected |
|----------|------|----------|----------|
|    Admin |    1 |        3 |          |
| Accounts |      |        2 |        1 |
|  Finance |      |        4 |        1 |

所需结果按任务状态项目进行分组。我怎样才能做到这一点?谢谢。

【问题讨论】:

标签: sql sql-server group-by


【解决方案1】:

您可以使用条件聚合:

SELECT
    Projects.Project
  , [Open]   = count(case when tasks.status='open' then 1 end)
  , Canceled = count(case when tasks.status='Canceled ' then 1 end)
  , Rejected = count(case when tasks.status='Rejected ' then 1 end)
  , Total = COUNT(Tasks.Status)
FROM
  Projects
  LEFT JOIN Tasks ON Projects.ID = Tasks.ProjectID
 GROUP BY
   Projects.Project

小提琴:http://sqlfiddle.com/#!6/4b862/4/0

返回:

+----------+------+----------+----------+-------+
| Project  | Open | Canceled | Rejected | Total |
+----------+------+----------+----------+-------+
| Accounts |    0 |        2 |        1 |     3 |
| Admin    |    1 |        3 |        0 |     4 |
| Finance  |    0 |        4 |        1 |     5 |
+----------+------+----------+----------+-------+

【讨论】:

    【解决方案2】:

    您可以使用此查询。

    SELECT * FROM 
    (
        SELECT
          Projects.Project,
          Tasks.Status
        FROM
          Projects
          LEFT JOIN Tasks ON Projects.ID = Tasks.ProjectID
    ) Src 
        PIVOT (COUNT(Status) FOR Status IN ([Open] ,[Canceled],[Rejected])) P
    

    结果:

    Project    Open        Canceled    Rejected
    ---------- ----------- ----------- -----------
    Accounts   0           2           1
    Admin      1           3           0
    Finance    0           4           1
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-09-28
      • 2018-02-19
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-11-02
      • 1970-01-01
      相关资源
      最近更新 更多