单个SELECT中的句子

时间:2018-03-01 10:28:33

标签: sql

我在数据库中有两个表。一个叫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

1 个答案:

答案 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
      ......