我在数据库中有两个表。一个被称为sec_users并且具有三个字段:
sec_users
pk_user, name, dias_disponibles
另一个被称为solicitud具有三个字段:
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
您可以使用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 ......