2015-10-05 53 views
0

我有一个表,看起来像这样:加入两个SELECT语句和调整他们

+-----------+--------------+---------------------+ 
| ENTRY_ID | EMPLOYEE_ID |  ACCESS_TIME | 
+-----------+--------------+---------------------+ 
| 001  |  1001  | 6/3/2014 8:08:00 AM | 
+-----------+--------------+---------------------+ 
| 777  |  1201  | 8/3/2015 7:07:00 AM | 
+-----------+--------------+---------------------+ 
| 888  |  1901  | 9/9/2015 4:04:00 PM | 
+-----------+--------------+---------------------+ 

为了获得唯一的用户数量为特定的日期范围,我有以下代码:

SELECT COUNT(UNIQUE Employee_Id) Unique_Monthly_Users FROM 
    (SELECT * FROM CORE.DATE_TEST 
     WHERE ACCESS_TIME >= TO_DATE('8/1/2015 00:00:00', 'MM/DD/YYYY HH24:MI:SS') 
     AND ACCESS_TIME < TO_DATE('9/1/2015 00:00:00', 'MM/DD/YYYY HH24:MI:SS') 
    ORDER BY ACCESS_TIME ASC) 

而获得当月该范围,我使用这个:

SELECT UNIQUE TO_CHAR(ACCESS_TIME, 'Month') Month_Name FROM (
    SELECT * FROM CORE.DATE_TEST 
     WHERE ACCESS_TIME >= TO_DATE('8/1/2015 00:00:00', 'MM/DD/YYYY HH24:MI:SS') 
     AND ACCESS_TIME < TO_DATE('9/1/2015 00:00:00', 'MM/DD/YYYY HH24:MI:SS') 
    ORDER BY ACCESS_TIME ASC) 

这是我的最终所需的输出:

+--------------+-----------+ 
| UNIQUE_USERS | MONTH | 
+--------------+-----------+ 
| 702931  | JANUARY | 
+--------------+-----------+ 
| 900000  | FEBRUARY | 
+--------------+-----------+ 
| 2139041022 | MARCH | 
+--------------+-----------+ 

现在我想加入这些语句:

SELECT COUNT(UNIQUE EMPLOYEE_ID) Unique_Emp FROM 
    ((SELECT * FROM CORE.DATE_TEST 
      WHERE ACCESS_TIME >= TO_DATE('8/1/2015 00:00:00', 'MM/DD/YYYY HH24:MI:SS') 
      AND ACCESS_TIME < TO_DATE('9/1/2015 00:00:00', 'MM/DD/YYYY HH24:MI:SS') 
     ORDER BY ACCESS_TIME ASC) col1) 
INNER JOIN (SELECT UNIQUE TO_CHAR(ACCESS_TIME, 'Month') Month_Name FROM (
    (SELECT * FROM CORE.DATE_TEST 
     WHERE ACCESS_TIME >= TO_DATE('8/1/2015 00:00:00', 'MM/DD/YYYY HH24:MI:SS') 
     AND ACCESS_TIME < TO_DATE('9/1/2015 00:00:00', 'MM/DD/YYYY HH24:MI:SS') 
    ORDER BY ACCESS_TIME ASC 
    ) col2) 
) ON COL1.ENTRY_ID = COL2.ENTRY_ID 

...但显然这是不行的。我无法获得“id”,因为不应该有任何结果集的ID。两者都是外部存在的集合。我得到以下错误:ORA-00904: "COL2"."ENTRY_ID": invalid identifier

如何正确地加入这些结果集,以便我可以得到所需的输出?

回答

1

中查找GROUP BY条款,然后试试这个:

select to_char(access_time, 'Month'), count(distinct employee_id) 
from core.date_test 
where usage_time >= TO_DATE('8/1/2015 00:00:00', 'MM/DD/YYYY HH24:MI:SS') 
and usage_time < TO_DATE('9/1/2015 00:00:00', 'MM/DD/YYYY HH24:MI:SS') 
group by to_char(access_time, 'Month'); 
+0

呃......并且觉得我几乎有这个,但忘了添加一个“GROUP BY”。非常感谢你。 –

1

你可以用两个分句做到这一点,第一个选择的不同用户各月,第二个计数他们:

SELECT 
    COUNT(*) AS UNIQUE_USERS, 
    T1.MONTH 
FROM 
(
    SELECT DISTINCT 
     USER_ID, 
     TO_CHAR(ACCESS_TIME) AS MONTH 
    FROM DATE_TEST 
) AS T1 
GROUP BY T1.MONTH 
+0

这需要在PLSQL下进行修改。例如,你必须在'T1'之前删除'AS'关键字。此外,它返回DD-MM-YY,这不是我想要的格式。最后,您必须将'TO_CHAR(ACCESS_TIME)'更改为'TO_CHAR(ACCESS_TIME,'月')'才能正确输出。好的选择,但。谢谢! –