我有一个相当大的查询被用来获得一堆结果,而且我几乎可以肯定这不是做到这一点的方法。它很肮脏。这是可恶的。首先,让我解释一下我所希望的表结构:Oracle SQL:简化我看似可怕的子查询集合
+------------------+------+------+------+------+--------+
| CURRENT_DATE | RO | FL | LM | AO | TOTAL |
+------------------+------+------+------+------+--------+
| 1/2/2012 | 31 | 33 | 70 | 10 | 144 |
+------------------+------+------+------+------+--------+
以上数据集从下表收集:
+---------------+--------------------+
| CURRENT_DATE | PORTABLE_PEANUTS |
+---------------+--------------------+
| 1/2/2012 | RO |
+---------------+--------------------+
| 2/4/2013 | FL |
+---------------+--------------------+
| 3/6/2014 | LM |
+---------------+--------------------+
| 4/8/2015 | AO |
+---------------+--------------------+
从本质上讲,我试图收集是发生在PORTABLE_PEANUTS
上有一定的一切日期,发生的频率以及发生了什么。
下面是我使用的查询:
SELECT total.CURRENT_DATE, results.RO, results.FL, results.LM, results.AO, total.TOTAL FROM
(
SELECT CURRENT_DATE, SUM(RO+FL+LM+AO) TOTAL FROM
(
SELECT a.CURRENT_DATE, a.RO, b.FL, c.LM, d.AO FROM
(
SELECT TO_CHAR(SESSION_DATE, 'yyyy-mm-dd') CURRENT_DATE, COUNT(PORTABLE_PEANUTS) RO FROM CORE.DATE_TEST
WHERE PORTABLE_PEANUTS LIKE 'RO'
GROUP BY TO_CHAR(SESSION_DATE, 'yyyy-mm-dd')
) a
JOIN
(
SELECT TO_CHAR(SESSION_DATE, 'yyyy-mm-dd') CURRENT_DATE, COUNT(PORTABLE_PEANUTS) FL FROM CORE.DATE_TEST
WHERE PORTABLE_PEANUTS LIKE 'FL'
GROUP BY TO_CHAR(SESSION_DATE, 'yyyy-mm-dd')
) b ON a.CURRENT_DATE = b.CURRENT_DATE
JOIN
(
SELECT TO_CHAR(SESSION_DATE, 'yyyy-mm-dd') CURRENT_DATE, COUNT(PORTABLE_PEANUTS) LM FROM CORE.DATE_TEST
WHERE PORTABLE_PEANUTS LIKE 'LM'
GROUP BY TO_CHAR(SESSION_DATE, 'yyyy-mm-dd')
) c ON a.CURRENT_DATE = c.CURRENT_DATE
JOIN
(
SELECT TO_CHAR(SESSION_DATE, 'yyyy-mm-dd') CURRENT_DATE, COUNT(PORTABLE_PEANUTS) AO FROM CORE.DATE_TEST
WHERE PORTABLE_PEANUTS LIKE 'AO'
GROUP BY TO_CHAR(SESSION_DATE, 'yyyy-mm-dd')
) d ON a.CURRENT_DATE = d.CURRENT_DATE
)
GROUP BY CURRENT_DATE
) total
JOIN
(
SELECT a.CURRENT_DATE, a.RO, b.FL, c.LM, d.AO FROM
(
SELECT TO_CHAR(SESSION_DATE, 'yyyy-mm-dd') CURRENT_DATE, COUNT(PORTABLE_PEANUTS) RO FROM CORE.DATE_TEST
WHERE PORTABLE_PEANUTS LIKE 'RO'
GROUP BY TO_CHAR(SESSION_DATE, 'yyyy-mm-dd')
) a
JOIN
(
SELECT TO_CHAR(SESSION_DATE, 'yyyy-mm-dd') CURRENT_DATE, COUNT(PORTABLE_PEANUTS) FL FROM CORE.DATE_TEST
WHERE PORTABLE_PEANUTS LIKE 'FL'
GROUP BY TO_CHAR(SESSION_DATE, 'yyyy-mm-dd')
) b ON a.CURRENT_DATE = b.CURRENT_DATE
JOIN
(
SELECT TO_CHAR(SESSION_DATE, 'yyyy-mm-dd') CURRENT_DATE, COUNT(PORTABLE_PEANUTS) LM FROM CORE.DATE_TEST
WHERE PORTABLE_PEANUTS LIKE 'LM'
GROUP BY TO_CHAR(SESSION_DATE, 'yyyy-mm-dd')
) c ON a.CURRENT_DATE = c.CURRENT_DATE
JOIN
(
SELECT TO_CHAR(SESSION_DATE, 'yyyy-mm-dd') CURRENT_DATE, COUNT(PORTABLE_PEANUTS) AO FROM CORE.DATE_TEST
WHERE PORTABLE_PEANUTS LIKE 'AO'
GROUP BY TO_CHAR(SESSION_DATE, 'yyyy-mm-dd')
) d ON a.CURRENT_DATE = d.CURRENT_DATE
) results ON total.CURRENT_DATE = results.CURRENT_DATE
ORDER BY CURRENT_DATE ASC;
现在这个查询工作,并且相对来说,它的速度不够快,但它看起来丑陋。这看起来很难维护,我很确定我在这里错过了一些东西。
哇,那真的很棒。有条件的聚合 - 我必须记住这一点。它不仅能够以更少的步骤完成我想要的操作,而且它的速度提高了一百倍。 –