我在数据库中有两个表。一个叫sec_users
,有三个字段:
pk_user, name, dias_disponibles
另一个名为solicitud
且有三个字段:
pk_solicitud, fk_empleado, n_diassolicitados
例如,每个用户有24天的假期可以创建休假请求,这些假期也可以是低,缺席或许可。好吧,我的问题是,为了使报告我对数据库进行查询,查询对我很有帮助,我得到了完整的报告,但这个查询我想用一个SELECT做一些帮助?
我在此留下我的疑问:
SELECT u.name, u.dias_disponibles,
(u.dias_disponibles - COALESCE(dias_disfrutados,0)) AS dias_libres,
COALESCE(dias_disfrutados,0) as dias_disfrutados,
COALESCE(dias_baja,0) as dias_baja,
COALESCE(ausencias,0) as dias_ausencias,
COALESCE(permisos,0) as dias_permisos,
COALESCE(rechazadas,0) as solicitud_rechazadas
FROM (SELECT u.*,
(SELECT SUM(N_DIASSOLICITADOS)
FROM solicitud s
WHERE s.fk_empleado = u.pk_user and s.fk_estado <> 2 and (s.fk_motivo = 1 OR s.fk_motivo = 2 OR s.fk_motivo = 3)
) as dias_disfrutados,
(SELECT SUM(N_DIASSOLICITADOS)
FROM solicitud s
WHERE s.fk_empleado = u.pk_user and FK_MOTIVO = 4) as dias_baja,
(SELECT SUM(N_DIASSOLICITADOS)
FROM solicitud s
WHERE s.fk_empleado = u.pk_user and FK_MOTIVO = 3) as ausencias,
(SELECT SUM(N_DIASSOLICITADOS)
FROM solicitud s
WHERE s.fk_empleado = u.pk_user and FK_MOTIVO = 5) as permisos,
(SELECT COUNT(FK_ESTADO) FROM solicitud s WHERE s.fk_empleado = u.pk_user and FK_ESTADO = 2) as rechazadas
FROM sec_users u
) u
我只想选择它,我不知道怎么做!
结果应该是这样的,但只有一个SELECT:
Usuario dias_disponibles dias_libres dias_disfrutados
============== ================ =========== ================
Usuario 1 24 10 14
答案 0 :(得分:0)
你可以使用case而不是几个subselect
SELECT u.name, u.dias_disponibles,
(u.dias_disponibles - COALESCE(dias_disfrutados,0)) AS dias_libres,
COALESCE(dias_disfrutados,0) as dias_disfrutados,
COALESCE(dias_baja,0) as dias_baja,
COALESCE(ausencias,0) as dias_ausencias,
COALESCE(permisos,0) as dias_permisos,
COALESCE(rechazadas,0) as solicitud_rechazadas
FROM (
select u.name, u.dias_disponibles
, sum( case when s.fk_estado <> 2
and (s.fk_motivo = 1
OR s.fk_motivo = 2
OR s.fk_motivo = 3)
then N_DIASSOLICITADOS else 0 end ) as dias_disfrutados
, sum( case when FK_MOTIVO = 4
then N_DIASSOLICITADOS else 0 end ) as dias_baja
, sum( case when FK_MOTIVO = 3
then N_DIASSOLICITADOS else 0 end ) as ausencias
, sum( case when FK_MOTIVO = 5
then N_DIASSOLICITADOS else 0 end ) as permisos
, sum( when FK_ESTADO = 2
then 1 else 0 end) s rechazadas
FROM sec_users u
inner join solicitud s on s.fk_empleado = u.pk_user
group by u.name, u.dias_disponibles ) u
如果用户还没有使用左连接
......
FROM sec_users u
left join solicitud s on s.fk_empleado = u.pk_user
......