2012-07-19 72 views
1

我想合併兩個選擇,使在PHP中使用一個查詢。 每個用戶報告時間,這段時間是任一正常時間(超時= 0)或超時(超時= 1)。SQL:合併兩個選擇一個查詢

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(時間0 +時間1 +時間2 +時間3 +時間4 +時間5 +時間6)

有什麼辦法可以合併兩個?試試這個link:現在它的外觀。我想6和5.5相結合,使11.5和5.5(加班費)被保留爲5.5

See this

+0

請提供採樣數據和期望的輸出。 – RedFilter 2012-07-19 14:58:12

回答

0

可以使用的情況下/然後結束語法做一個查詢中的條件語句。

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 
+0

這並不工作,我很害怕,它的葉子都爲0 – user1538256 2012-07-19 15:09:42

+0

嘗試更新的答案 – 2012-07-19 15:14:25

+0

請查看更新的問題,我添加了鏈接,因爲它仍然沒有工作 – user1538256 2012-07-19 15:31:20

1

你可以這樣說:

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; 

這應該給你「加時」的總和拖入加時,而其他時間爲「normaltime」的總和。如果我理解正確的話,你記錄的加班時間進入加時賽列,無加班時間在其他地方。

相反,如果你用加班,意思是「時間0/1/2現在加班」「標誌」,那麼你需要把它寫這樣的:

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; 
+0

我有什麼是時間0/1/2 ... time6和如果time0 ... 6是正常時間或加班,則將加班列設置爲0或1。我更新了這個問題,謝謝。 – user1538256 2012-07-19 15:35:19

0

否則不工會滿足您的需求(當然不是最好的面向業績的答案)?

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