2014-11-01 47 views
1

我遇到了一個問題,我一直在盯着幾個小時,似乎無法解決。
我有一個表,其內容爲:COUNT或SUM(CASE)從單列中的單列

CALLS 
CALL_REF {PK} 
TIME 
CALLER_ID {FK} 
DETAIL 
TAKEN_BY {FK} 
ASSIGNED_TO {FK} 
STATUS 

實例行是:

1411 8/19/2014 1808 0093 "Detail" AB2 EB1 Closed 
1372 8/19/2014 1238 0096 "Detail" MM1 MW1 Open 

我需要做的是計算的封閉式和開放式的量在特定日期和一定的時間之間創建以下輸出:

Date  Shift Status Calls 
19-AUG-14 early Closed 47 
19-AUG-14 early Open 1 
19-AUG-14 late Closed 38 

從另一個表中取出換檔。

到目前爲止,我有這樣的:

SELECT shifts.shift_date AS "Date", 
     shifts.shift_time AS "Time", 
     calls.status  AS "Status", 
     SUM(CASE 
      WHEN calls.status = 'Closed' THEN 1 
      ELSE NULL 
      end)   AS "Open Calls", 
     SUM(CASE 
      WHEN calls.status = 'Open' THEN 1 
      ELSE NULL 
      end)   AS "Closed Calls" 
FROM calls 
     INNER JOIN shifts 
       ON shifts.shift_date = calls.call_date 
WHERE calls.call_date = '19-AUG-14' 
     AND calls.call_time BETWEEN TO_DATE('08:00', 'HH24:MI') AND 
            TO_DATE('14:00', 'HH24:MI') 
     OR calls.call_date = '19-AUG-14' 
      AND calls.call_time BETWEEN TO_DATE('14:00', 'HH24:MI') AND 
             TO_DATE('20:00', 'HH24:MI') 
GROUP BY shifts.shift_date, 
      shifts.shift_time, 
      calls.status 
ORDER BY shifts.shift_time, 
      calls.status; 

,輸出:

Date  Time Status Open Calls Closed Calls 
19-AUG-14 Early Closed    85 
19-AUG-14 Early Open  1 
19-AUG-14 Late Closed    85 
19-AUG-14 Late Open  1 

這顯然是錯誤的,但我無能,如何將兩者結合起來,並將它們兩個移位之間分開倍。 請幫忙!

這裏是數據庫的完整佈局,如果你需要的話。 http://i.stack.imgur.com/mKGHU.png

enter image description here

編輯:
現在,我使用||之間的兩個總和聲明,將他們移動到同一列。但數字仍然是總數。他們需要在早班和晚班之間分開。

SELECT SHIFTS.SHIFT_DATE AS "Date", 
     SHIFTS.SHIFT_TIME AS "Time", 
     CALLS.STATUS AS "Status", 
     SUM(CASE 
      WHEN CALLS.STATUS = 'Closed' THEN 1 
      ELSE NULL END) || 
     SUM(CASE 
      WHEN CALLS.STATUS = 'Open' THEN 1 
      ELSE NULL END) AS "Calls" 
FROM CALLS 
INNER JOIN SHIFTS 
     ON SHIFTS.SHIFT_DATE = CALLS.CALL_DATE 
WHERE CALLS.CALL_DATE = '19-AUG-14' 
    AND (CALLS.CALL_TIME BETWEEN TO_DATE('08:00','HH24:MI') 
    AND TO_DATE('14:00','HH24:MI') 
OR CALLS.CALL_DATE = '19-AUG-14' 
    AND CALLS.CALL_TIME BETWEEN TO_DATE('14:00','HH24:MI') AND TO_DATE('20:00','HH24:MI') 
) 
GROUP BY SHIFTS.SHIFT_DATE, 
     SHIFTS.SHIFT_TIME, 
     CALLS.STATUS 
ORDER BY SHIFTS.SHIFT_TIME, 
     CALLS.STATUS; 
+0

TO_DATE('14:00' , 'HH24:MI')給你當年,當月,當月14:00的第一天。那真的是你想要的嗎? – Multisync 2014-11-01 21:34:35

回答

0

某些語法可能不正確,因爲我不熟悉Oracle,但我認爲下面的查詢應根據您的原始查詢爲您提供期望的結果。

SELECT 
    Date 
    , Shift 
    , Status 
    , COUNT(*) AS "Calls" 

FROM 
    (
     SELECT 
      SHIFTS.SHIFT_DATE AS "Date" 
      , CASE 
       WHEN SHIFTS.SHIFT_TIME BETWEEN TO_DATE('08:00','HH24:MI') 
              AND TO_DATE('14:00','HH24:MI') 
        THEN 'Early' 
       ELSE 'Late' 
      END AS "Shift" 
      , CALLS.STATUS AS "Status" 

     FROM 
      CALLS 
      INNER JOIN SHIFTS 
       ON CALLS.CALL_DATE = SHIFTS.SHIFT_DATE 

     WHERE 
      CALLS.CALL_DATE = '19-AUG-14' 
      AND CALLS.CALL_TIME BETWEEN TO_DATE('08:00','HH24:MI') 
            AND TO_DATE('20:00','HH24:MI') 
    ) AS ShiftGroup 

GROUP BY 
    Date 
    , Shift 
    , Status 
+0

這很接近,但在GROUP BY中收到了很多無效標識符。 – 2014-11-01 22:06:45

0

其實這很明顯(現在我正在看它)。您的投影包括現狀:

calls.status  AS "Status", 

所以,你必須包含在GROUP BY子句中的狀態,在那意味着你的聚合相加的記錄僅與該狀態,所以一個集合,每行空。我有一個SQL小提琴與您的查詢的簡化版本。 Check it out.

的解決方法是刪除狀態:

SELECT SHIFTS.SHIFT_DATE AS "Date", 
     SHIFTS.SHIFT_TIME AS "Time", 
     SUM(CASE 
      WHEN CALLS.STATUS = 'Closed' THEN 1 
      ELSE NULL END) as "Closed Calls", 
     SUM(CASE 
      WHEN CALLS.STATUS = 'Open' THEN 1 
      ELSE NULL END) AS "Open Calls" 
FROM CALLS 
INNER JOIN SHIFTS 
     ON SHIFTS.SHIFT_DATE = CALLS.CALL_DATE 
WHERE CALLS.CALL_DATE = '19-AUG-14' 
    AND (CALLS.CALL_TIME BETWEEN TO_DATE('08:00','HH24:MI') 
    AND TO_DATE('14:00','HH24:MI') 
OR CALLS.CALL_DATE = '19-AUG-14' 
    AND CALLS.CALL_TIME BETWEEN TO_DATE('14:00','HH24:MI') AND TO_DATE('20:00','HH24:MI') 
) 
GROUP BY SHIFTS.SHIFT_DATE, 
     SHIFTS.SHIFT_TIME 
ORDER BY SHIFTS.SHIFT_TIME; 
+0

但是這不是聚合函數的情況,是嗎? – 2014-11-03 10:09:08