显示几天享受sql

时间:2018-02-27 12:25:49

标签: sql

我的查询是我有两个表,一个名为sec_users,其中包含以下字段:

pk_user, name, days_available

另一个电话solicitud,其中包含以下字段:

pk_solicitud, fk_empleado, n_dias

fk_empleado的{​​{1}}是solicitud表的pk_user外键

好吧,我有一个小报告,它向我展示了每个用户留下的免费日期,但我也希望向您显示该用户请求的日期和相同的查询

例如,24天休息的user1会创建一个应用程序,并要求4天休息,另外10天。我想让你告诉我除了24-4-10 = 14天的剩余天数之外,你必须告诉我你已经使用过的日子:24-14 = 10天消耗。我有以下代码,但它给了我不想要的数字:

sec_users

这个功能告诉我这个:

SELECT u.pk_user, u.dias_disponibles - sum(s.n_diassolicitados) AS dias_libres, (SELECT SUM(N_DIASSOLICITADOS) as dias_disfrutados FROM solicitud)
FROM sec_users u, solicitud s
WHERE s.fk_empleado = u.pk_user
GROUP BY u.pk_user

你必须告诉我这个:

Usuario             dias_libres   dias_disfrutados
==============    ==============  ==============
Usuario 1                10              79   

鼻子,因为它没有显示。

2 个答案:

答案 0 :(得分:1)

You have not filtered by user, this is how you need it:

SELECT u.pk_user, 
       u.dias_disponibles - sum(s.n_diassolicitados) AS dias_libres, 
       (SELECT SUM(N_DIASSOLICITADOS) as dias_disfrutados 
        FROM solicitud s2
        WHERE s2.fk_empleado = u.pk_user)
FROM sec_users u

join solicitud s
ON s.fk_empleado = u.pk_user

GROUP BY u.pk_user

但是,这不是质量代码。最好只包括它:

 SELECT u.pk_user, 
       u.dias_disponibles - sum(s.n_diassolicitados) AS dias_libres, 
       SUM(N_DIASSOLICITADOS) as dias_disfrutados
    FROM sec_users u

    join solicitud s
    ON s.fk_empleado = u.pk_user

    GROUP BY u.pk_user

答案 1 :(得分:1)

我怀疑你想要:

SELECT u.pk_user,
       (u.dias_disponibles - COALESCE(dias_disfrutados, 0)) AS dias_libres,
       COALESCE(dias_disfrutados, 0)
FROM (SELECT u.*,
             (SELECT SUM(N_DIASSOLICITADOS)
              FROM solicitud s
              WHERE s.fk_empleado = u.pk_user
             ) as dias_disfrutados
      FROM sec_users u 
     ) u;

注意:

  • 从不FROM子句中使用逗号。 始终使用正确的JOIN语法。
  • 您似乎不需要外部聚合。
  • 计算一次所需的值,然后在需要的地方使用它。