Sql 每个ID有多少个“;第1列”“;第2列”;和“;总计”;并按“;总计”;

Sql 每个ID有多少个“;第1列”“;第2列”;和“;总计”;并按“;总计”;,sql,database,postgresql,Sql,Database,Postgresql,我在PostgreSQL 9.2中有下表: CREATE TABLE leave ( "ID" text NOT NULL, "Leave class" text NOT NULL, "Leave Date" date NOT NULL, CONSTRAINT leave_pkey PRIMARY KEY (payroll, "Leave class", "Leave Date") ) 我想得到每个ID上有多少“紧急”、“病假”和“总假期”,并按“总假期”(降序)排序。大概是

我在PostgreSQL 9.2中有下表:

CREATE TABLE leave
(
  "ID" text NOT NULL,
  "Leave class" text NOT NULL,
  "Leave Date" date NOT NULL,
  CONSTRAINT leave_pkey PRIMARY KEY (payroll, "Leave class", "Leave Date")
)

我想得到每个ID上有多少“紧急”、“病假”和“总假期”,并按“总假期”(降序)排序。大概是这样的:

类似的内容(不清楚是否使用ID或工资单)


请参见

这也将显示零计数:如果要从另一个表中获取工资值,这一点很重要

查看更多信息

更简单的代码在这里


显示的输入不清楚期望的结果:23266只有一次病假,不是吗?23234有一张病假和一张紧急病假。@RaphaëlAlthaus,我在最后一张桌子上搞错了对不起。
select Payroll,
       sum(case when "Leave class" = 'Emergency' then 1 else 0 end) as "emergency leave",
       sum(case when "Leave class" = 'Sick' then 1 else 0 end) as "Sick leave",
       count(*) as "Total"
FROM leave
group by Payroll
order by count(*) desc;
SELECT
  base.payroll,
  leaveCounts.Emergency,
  leaveCounts.Sick,
  leaveCounts.Total
FROM
 (SELECT DISTINCT payroll FROM leave) AS base
  LEFT JOIN
 (SELECT
     COUNT(CASE WHEN "Leave class" = 'Emergency' THEN 1 END) AS Emergency, 
     COUNT(CASE WHEN "Leave class" = 'Sick' THEN 1 END) AS Sick,
     COUNT(*) AS Total,
     payroll
  FROM
      leave
  GROUP BY
     payroll
  ) AS leaveCounts
      ON base.payroll = leaveCOunts.payroll
ORDER BY
  leaveCOunts.Total DESC;
SELECT
     payroll,
     COUNT(CASE WHEN "Leave class" = 'Emergency' THEN 1 END) AS Emergency, 
     COUNT(CASE WHEN "Leave class" = 'Sick' THEN 1 END) AS Sick,
     COUNT(*) AS Total
  FROM
      leave
  GROUP BY
      payroll
   ORDER BY
     COUNT(*) DESC;