簡體   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