【问题标题】:SQL: Merge two selects to one querySQL:将两个选择合并到一个查询中
【发布时间】:2012-07-18 19:06:20
【问题描述】:

我想合并两个选择以进行一个查询以在 PHP 中使用。 每个用户报时间,这个时间要么是正常时间(加班=0),要么是加班(加班=1)。

SELECT username, 
       userlastname,
       SUM(time0 + time1 + time2 + time3 + time4 + time5 + time6),
       userid,
       overtime 
FROM users, time 
WHERE timeyear = $y
      AND timeproid = $proid 
      AND userid = timeuserid
      AND timeweek = $week 
GROUP BY userlastname, username, userid, overtime

我显示了一个表格,其中每个用户有两行,一列用于加班时间,另一行用于正常时间。我选择加班是因为如果加班 = 0 将加班时间显示为 0 否则将加班时间显示为 SUM(time0 + time1 + time2 + time3 + time4 + time5 + time6)

有什么办法可以合并这两者吗?试试这个link:它现在的样子。我希望将 6 和 5.5 组合成 11.5,并将 5.5(加班)保留为 5.5

See this

【问题讨论】:

  • 请提供示例数据和所需的输出。

标签: php sql join merge union


【解决方案1】:

否则联合是否满足您的需求(当然不是以性能为导向的最佳答案)?

SELECT username, 
       userlastname,
       SUM(time0 + time1 + time2 + time3 + time4 + time5 + time6) as overtime,
       userid,
       overtime 
FROM users, time 
WHERE timeyear = $y
      AND timeproid = $proid 
      AND userid = timeuserid
      AND timeweek = $week 
      AND overtime=1
GROUP BY userlastname, username, userid
union
SELECT username, 
       userlastname,
       0 as overtime,
       userid,
       overtime 
FROM users, time 
WHERE timeyear = $y
      AND timeproid = $proid 
      AND userid = timeuserid
      AND timeweek = $week
      AND overtime=0 
GROUP BY userlastname, username, userid

【讨论】:

    【解决方案2】:

    你可以这样做:

    SELECT username,
           userlastname,
           SUM(CASE WHEN overtime = 0 THEN
                  time0 + time1 + time2 + time3 + time4 + time5 + time6
               ELSE 0 END) AS normaltime,
           userid,
           SUM(overtime) AS overtime
    FROM users, time 
    WHERE timeyear = $y
      AND timeproid = $proid 
      AND userid = timeuserid
      AND timeweek = $week 
    GROUP BY userlastname, username, userid;
    

    这应该给你“加班”的总和为加班,其他时间的总和为“正常时间”。如果我理解正确,您将加班时间记录在加班列中,而其他地方则记录不加班时间。

    如果您将超时用作“标志”,表示“time0 现在超时”,那么您需要这样写:

    SELECT username,
           userlastname,
           SUM(CASE WHEN overtime = 0 THEN
                  time0 + time1 + time2 + time3 + time4 + time5 + time6
               ELSE 0 END) AS normaltime,
           userid,
           SUM(CASE WHEN overtime != 0 THEN
                  time0 + time1 + time2 + time3 + time4 + time5 + time6
               ELSE 0 END) AS overtime,
    FROM users, time 
    WHERE timeyear = $y
      AND timeproid = $proid 
      AND userid = timeuserid
      AND timeweek = $week 
    GROUP BY userlastname, username, userid;
    

    【讨论】:

    • 我所拥有的是 time0...time6 和一个设置为 0 或 1 的加班列,表示 time0...6 是正常时间还是加班时间。我更新了问题谢谢。
    【解决方案3】:

    您可以使用 CASE WHEN/THEN END 语法在查询中执行条件语句。

    SELECT u.username, u.userlastname, CASE WHEN t.overtime = 1 THEN SUM(t.time0 + t.time1 + t.time2 + t.time3 + t.time4 + t.time5 + t.time6) ELSE 0 END as overtime, u.userid
    FROM users u 
    LEFT JOIN time t ON(u.userid=t.timeuserid)
    WHERE t.timeyear = $y AND t.timeproid = $proid AND t.timeweek = $week 
    GROUP BY u.userlastname, u.username, u.userid, t.overtime
    

    【讨论】:

    • 请查看更新后的问题和我添加的链接,因为它仍然无法正常工作
    猜你喜欢
    • 1970-01-01
    • 2016-07-26
    • 1970-01-01
    • 1970-01-01
    • 2016-01-23
    • 1970-01-01
    • 1970-01-01
    • 2015-02-02
    • 2014-11-09
    相关资源
    最近更新 更多