具有子查询的多个GROUP BY

时间:2014-02-10 20:40:38

标签: mysql sql

我正在尝试创建一个查询,它将在两个单独的列中为我提供两个单独的COUNT。申请计数和已批准申请的计数。我希望在一段时间内每个月显示这些计数。像这样:

date      applications  approvals
January   20            3    
February  25            1
March     20            4
April     10            2

使用子查询时,我使用“GROUP BY MONTH(APPL_CREATE_DT)”对主查询进行了分组。但问题在于,它只对第一列进行了正确分组,而下一列包含每个月的相同计数。如果我将相同的GROUP BY添加到其他子查询部分,那么我得到1242错误。

任何关于如何解决这个问题的想法都会有所帮助。我已经看到过这样的其他问题,但他们并没有那么依赖其他条款来解决问题。

SELECT
COUNT(DISTINCT APPL_ID) AS Applications,
(SELECT COUNT(DISTINCT APPL_ID)
FROM APPL_APP
JOIN APPU_APP_USER ON APPL_ID = APPU_APPL_ID
LEFT JOIN APPD_APP_DECISION ON APPD_APPL_ID = APPL_ID
 WHERE APPD_STATUS = 'LENDER_APPROVED'
  AND APPU_CUR_STATE = 'TX'
  AND APPL_CREATE_DT >= '2013-01-01 00:00:00'
  AND APPL_CREATE_DT <= '2014-01-31 23:59:59'
GROUP BY MONTH(APPL_CREATE_DT)) AS Approvals
FROM APPU_APP_USER
JOIN APPL_APP ON APPL_ID = APPU_APPL_ID
 AND APPL_CREATE_DT >= '2013-01-01 00:00:00'
 AND APPL_CREATE_DT <= '2014-01-31 23:59:59'
 AND APPU_CUR_STATE = 'TX'
GROUP BY MONTH(APPL_CREATE_DT);

1 个答案:

答案 0 :(得分:0)

为了简单起见,我删除了一些条件。

如你所说

  

我查找了类似MONTH(outerTable.APPL_CREATE_DATE)= MONTH(inner_table.APPL_CREATE_DATE)

的内容

你是对的。

  

但我不知道将它放在哪里使其正常工作

我希望以下查询可以帮到你。

SELECT
    COUNT(DISTINCT APPL_ID) AS Applications,
    (
        SELECT COUNT(DISTINCT APPL_ID)
        FROM APPL_APP INNER JOIN APPU_APP_USER ON APPL_ID = APPU_APPL_ID
          LEFT JOIN APPD_APP_DECISION ON APPD_APPL_ID = APPL_ID
        WHERE APPD_STATUS = 'LENDER_APPROVED'
          AND MONTH(APPL_CREATE_DT) = MONTH(t1.APPL_CREATE_DT)
          ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^= This condition added
        GROUP BY MONTH(APPL_CREATE_DT)
    ) AS Approvals
FROM APPL_APP t1 INNER JOIN APPU_APP_USER ON APPL_ID = APPU_APPL_ID
              ^^===== Alias added
GROUP BY MONTH(APPL_CREATE_DT);

请注意,MySQL的相关子查询在我的经验中表现极差。如果可能,请考虑将您的查询转换为仅使用子查询。