2014-11-01 45 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