繁体   English   中英

我无法创建此 PostgreSQL 查询:按与“排序依据”条件不同的条件分组

[英]I can't create this PostgreSQL Query: Grouping by a different condition to the "order by" condition

我需要以不同的方式对我的查询进行排序我需要对表进行分组。 我需要计算每个部门有多少男性,但按每个部门的人数(不仅是男性,还有女性)以降序方式组织查询。

这是表格的图表和代码:

表的关系 model

 CREATE SCHEMA Academico;

CREATE TABLE Academico.PAIS(
ID int NOT NULL,
NOMBRE varchar(30) NOT NULL,
DESCRIPCION varchar(120) NULL,
CONSTRAINT PK_PAIS PRIMARY KEY (ID));

CREATE TABLE Academico.DEPARTAMENTO(
ID int NOT NULL,
NOMBRE varchar(30) NOT NULL,
CODIGO int NOT NULL,
DESCRIPCION varchar(120) NULL,
IDPAIS int NOT NULL,
CONSTRAINT PK_DEPARTAMENTO PRIMARY KEY (ID));

CREATE TABLE Academico.CIUDAD(
ID int NOT NULL,
NOMBRE varchar(255) NOT NULL,
CODIGO int NOT NULL,
DESCRIPCION varchar(120) NULL,
IDDEPARTAMENTO int NOT NULL,
CONSTRAINT PK_CIUDAD PRIMARY KEY (ID));


ALTER TABLE Academico.DEPARTAMENTO
ADD CONSTRAINT FK_DEPARTAMENTO_PAIS FOREIGN KEY(IDPAIS)
REFERENCES Academico.PAIS (ID)
on delete restrict on update restrict;

ALTER TABLE Academico.CIUDAD
ADD CONSTRAINT FK_CIUDAD_DEPARTAMENTO FOREIGN KEY(IDDEPARTAMENTO)
REFERENCES Academico.DEPARTAMENTO (ID)
on delete restrict on update restrict;


CREATE TABLE Academico.SEXO(
ID int NOT NULL,
NOMBRE varchar(30) NOT NULL,
DESCRIPCION varchar(120) NULL,
CONSTRAINT PK_SEXO PRIMARY KEY (ID));

CREATE TABLE Academico.TIPODOCUMENTO(
ID int NOT NULL,
NOMBRE varchar(30) NOT NULL,
DESCRIPCION varchar(120) NULL,
CONSTRAINT PK_TIPODOCUMENTO PRIMARY KEY (ID));


CREATE TABLE Academico.PERSONA(
ID int NOT NULL,
NOMBRE varchar(10) NOT NULL,
APELLIDO varchar(30) NOT NULL,
IDSEXO  int NOT NULL REFERENCES Academico.SEXO(id),
IDCIUDAD int NOT NULL REFERENCES Academico.CIUDAD(id),
DOCUMENTO varchar(50) NOT NULL,
IDTIPODOCUMENTO  int NOT NULL REFERENCES Academico.TIPODOCUMENTO(id),
FECHANACIMIENTO date NULL CHECK (FECHANACIMIENTO > '1900-01-01'),
FEvarcharEGISTRO date NOT NULL DEFAULT  Now() ,
email varchar (355) UNIQUE NOT NULL,
PROFESION varchar(12) NULL,
PERFIL varchar(120) NULL,
CONSTRAINT PK_PERSONA PRIMARY KEY
(ID) );

我尝试了这两个查询,它们以不同的方式给出了预期的结果:


select 
    d.nombre as _departamento, s.nombre as sex, count(1) as total_sexo
from 
    academico.persona p, academico.sexo s,
    academico.ciudad c, academico.departamento d 
where 
    p.idsexo = s.id 
    and p.idciudad = c.id 
    and c.iddepartamento = d.id
    and upper( s.nombre ) = 'MASCULINO'
group by 
    d.id,
    s.id 
order by 
    d.nombre
    
-- =======================================================
-- I don't know how to "merge" these two into one query 
-- =======================================================  

select 
    d.nombre as _departamento,  count(1) as total_gente
from 
    academico.persona p, academico.ciudad c,
    academico.departamento d, academico.sexo s 
where 
    p.idciudad = c.id 
    and c.iddepartamento = d.id
    and p.idsexo = s.id 
group by 
    d.id
order by 
    total_gente desc
         
;

我只需要一个查询就可以得到这些结果

这是FILTER (WHERE...)构造的完美用法。

...
count(1) as total_gente, 
count(1) filter (where upper( s.nombre ) = 'MASCULINO') as total_masculino
...

然后从主 where 子句中取出upper( s.nombre ) = 'MASCULINO'

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM