2015-10-05 18 views
1

我有两个不同的结果集:三列组 - 在Oracle中?

Result 1: 

+--------------+--------------+ 
| YEAR_MONTH | UNIQUE_USERS | 
+--------------+--------------+ 
| 2013-08 |  1111  | 
+--------------+--------------+ 
| 2013-09 |  2222  | 
+--------------+--------------+ 

Result 2: 

+--------------+----------------+ 
| YEAR_MONTH | UNIQUE_ACTIONS | 
+--------------+----------------+ 
| 2013-08 | 111111111 | 
+--------------+----------------+ 
| 2013-09 | 222222222 | 
+--------------+----------------+ 

为结果1的代码:

SELECT TO_CHAR(ACCESS_DATE, 'yyyy-mm') YEAR_MONTH, COUNT(DISTINCT EMPLOYEE_ID) UNIQUE_USERS 
    FROM CORE.DATE_TEST 
GROUP BY TO_CHAR(ACCESS_DATE, 'yyyy-mm') 
ORDER BY YEAR_MONTH ASC 

为结果2的代码:

SELECT TO_CHAR(ACCESS_DATE, 'yyyy-mm') YEAR_MONTH, COUNT(DISTINCT EMPLOYEE_ACTION) UNIQUE_ACTIONS 
    FROM CORE.ACTION_TEST 
GROUP BY TO_CHAR(ACCESS_DATE, 'yyyy-mm') 
ORDER BY YEAR_MONTH ASC 

然而,I”我试图通过简单的做到这一点来分组他们:

SELECT TO_CHAR(ACCESS_DATE, 'yyyy-mm') YEAR_MONTH, COUNT(DISTINCT EMPLOYEE_ID) UNIQUE_USERS, COUNT(DISTINCT EMPLOYEE_ACTION) UNIQUE_ACTIONS 
    FROM CORE.DATE_TEST, CORE.ACTION_TEST 
GROUP BY TO_CHAR(ACCESS_DATE, 'yyyy-mm') 
ORDER BY YEAR_MONTH ASC 

而这不起作用。我还尝试了第二个结果集上的INNER JOINresult set 1t1作为变量名,result set 2t2),并在t2上得到了错误Invalid Identifier

这是我想要的输出:

+--------------+--------------+----------------+ 
| YEAR_MONTH | UNIQUE_USERS | UNIQUE_ACTIONS | 
+--------------+--------------+----------------+ 
| 2013-08 |  1111  | 111111111 | 
+--------------+--------------+----------------+ 
| 2013-09 |  2222  | 222222222 | 
+--------------+--------------+----------------+ 

我该怎么做对了吗?它不一定需要成为三列组;它只是需要工作。

+2

FULL OUTER JOIN两个选择的,包括通过...分组。 – jarlh

+0

在PLSQL中?我以为'FULL OUTER JOIN'只支持SQL:1999语法? –

+0

对不起,没有意识到这个限制。 – jarlh

回答

3

尝试:

select a.YEAR_MONTH, a.UNIQUE_USERS, b.UNIQUE_ACTIONS 
from (
    SELECT TO_CHAR(ACCESS_DATE, 'yyyy-mm') YEAR_MONTH, 
     COUNT(DISTINCT EMPLOYEE_ID) UNIQUE_USERS 
    FROM CORE.DATE_TEST 
    GROUP BY TO_CHAR(ACCESS_DATE, 'yyyy-mm') 
) a 
join (
    SELECT TO_CHAR(ACCESS_DATE, 'yyyy-mm') YEAR_MONTH, 
     COUNT(DISTINCT EMPLOYEE_ACTION) UNIQUE_ACTIONS 
    FROM CORE.ACTION_TEST 
    GROUP BY TO_CHAR(ACCESS_DATE, 'yyyy-mm') 
) b 
on a.YEAR_MONTH = b.YEAR_MONTH 
order by a.YEAR_MONTH ASC 
+0

完美!这比下面的解决方案快上百万倍。我不知道你可以用这种方式做选择。用这个练习时间! –

+0

如果一个年份/月份组合出现在一个表格中,而另一个表格中没有,那么结果中将忽略该年份/月份。 – Allan

2

如果两个表都有很多记录,则笛卡尔连接是一个糟糕的解决方案,实际上可能不会提供您想要的答案。我想解决这个问题是这样的:

SELECT TO_CHAR (COALESCE (t1.year_month, t2.year_month), 'yyyy-mm') 
      AS year_month, 
     t1.unique_users, 
     t2.unique_actions 
FROM  (SELECT TRUNC (access_date, 'mm') AS year_month, 
        COUNT (DISTINCT employee_id) AS unique_users 
      FROM  core.date_test 
      GROUP BY TRUNC (access_date, 'mm')) t1 
     FULL OUTER JOIN 
     (SELECT TRUNC (access_date, 'mm') AS year_month, 
        COUNT (DISTINCT employee_action) AS unique_actions 
      FROM  core.action_test 
      GROUP BY TRUNC (access_date, 'mm')) t2 
      ON t1.year_month = t2.year_month 
ORDER BY COALESCE (t1.year_month, t2.year_month) ASC 

原因笛卡尔加入表现不佳的是,在第一个表中的每一行必须与每行中的第二个表应用group by之前匹配。如果每个表只有1000行,那就是数据库必须构建的1,000,000个值。

0
SELECT date.TO_CHAR(ACCESS_DATE, 'yyyy-mm') YEAR_MONTH, COUNT(DISTINCT date.EMPLOYEE_ID) UNIQUE_USERS, COUNT(DISTINCT act.EMPLOYEE_ACTION) UNIQUE_ACTIONS 
    FROM CORE.DATE_TEST date, CORE.ACTION_TEST act 
    WHERE date.TO_CHAR(ACCESS_DATE, 'yyyy-mm')=act.TO_CHAR(ACCESS_DATE, 'yyyy-mm') 
    ORDER BY YEAR_MONTH ASC 

希望这将作为我们需要指定的地方,我们要提取行的表名....