Oracle中的三列分组?

时间:2015-10-05 14:52:04

标签: sql oracle

我有两个不同的结果集:

setRowSorter(...)

结果1的代码

Result 1:

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

Result 2:

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

结果2的代码

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

但是,我试图通过简单地对它们进行分组:

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

这不起作用。我还尝试了第二个结果集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 JOIN result set 1作为变量名,t1result set 2),得到了t2上的错误t2

这是我想要的输出:

Invalid Identifier

我该如何正确地做到这一点?它不一定需要是一个三列组;它只需要工作。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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个值。

答案 2 :(得分: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

希望这将起作用,因为我们需要指定我们想要提取行的表名....