小编典典

单个SELECT中的句子

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

阅读 194

收藏
2021-05-16

共1个答案

小编典典

您可以使用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

如果用户从未使用过Mathc,则使用左联接

      ......
      FROM sec_users u 
      left join solicitud s on s.fk_empleado = u.pk_user
      ......
2021-05-16