mysql - SQL中如何对结果进行分组?

标签 mysql sql select

我正在从 1 个表进行查询,并使用 UNION 和 2 个具有不同条件的 select

SELECT *
FROM (
      SELECT DATE(MAX(RECEIVED)) DT,
             INFO CASH_INFO,
             SUM(IF(TRANS_TYPE = 714, AMOUNT, 0)) TOTAL_CASH,
             '' AS OTHER_INFO,
             0 AS TOTAL_CHEQUE,
             0 AS TOTAL_CREDIT
      FROM PAYMENT
      WHERE LOGIN = 'opensys' 
        AND SOURCE_OF_TRX = '245T2' 
        AND RET_CODE_ID IN (0, 106, 110) 
        AND RECEIVED >= DATE_SUB('2015-09-23 16:30:42', INTERVAL 7 DAY) 
        AND TRANS_TYPE = 714
      GROUP BY INFO
      UNION
      SELECT DATE(MAX(RECEIVED)) DT,
             '' AS CASH_INFO,
             0 AS TOTAL_CASH,    
             INFO OTHER_INFO,
             SUM(IF(TRANS_TYPE = 715, AMOUNT, 0)), -- TOTAL_CHEQUE,
             SUM(IF(TRANS_TYPE = 716, AMOUNT, 0)) -- TOTAL_CREDIT
      FROM PAYMENT
      WHERE LOGIN = 'opensys' 
        AND SOURCE_OF_TRX = '245T2' 
        AND RET_CODE_ID IN (0, 106, 110) 
        AND RECEIVED >= DATE_SUB('2015-09-23 16:30:42', INTERVAL 7 DAY) 
        AND TRANS_TYPE in (715, 716)
      GROUP BY INFO
     ) A
GROUP BY CASH_INFO, OTHER_INFO
ORDER BY DT

结果并不准确,因为该记录没有对相同日期的记录进行分组。

我想要实现的是将结果与相同日期分组。

P/S:最后 2 条记录将始终返回相同的日期。这意味着 2015 年 9 月 23 日将有 2 个日期。

抱歉,我无法发布图片,因此我必须将其链接到我的 Google 云端硬盘。 image

最佳答案

不幸的是,MySQL 允许您发布的查询,但在几乎所有 RDMS SQL 引擎中都会失败,因为您选择带有 * 的项目,而不受聚合查询中的 GROUP BY 子句的限制。如果您设置了 sql_mode to ANSI此查询将给出 GROUP BY 错误。

考虑聚合查询的更正 ANSI 语法,仅选择要聚合的字段,然后按日期、cash_info 和 other_info 字段进行分组。

SELECT DT, 
       CASH_INFO, 
       Sum(TOTAL_CASH), 
       OTHER_INFO, 
       Sum(TOTAL_CHEQUE), 
       Sum(TOTAL_CREDIT)
FROM (
      SELECT DATE(MAX(RECEIVED)) DT,
             INFO CASH_INFO,
             SUM(IF(TRANS_TYPE = 714, AMOUNT, 0)) TOTAL_CASH,
             '' AS OTHER_INFO,
             0 AS TOTAL_CHEQUE,
             0 AS TOTAL_CREDIT
      FROM PAYMENT
      WHERE LOGIN = 'opensys' 
        AND SOURCE_OF_TRX = '245T2' 
        AND RET_CODE_ID IN (0, 106, 110) 
        AND RECEIVED >= DATE_SUB('2015-09-23 16:30:42', INTERVAL 7 DAY) 
        AND TRANS_TYPE = 714
      GROUP BY INFO
      UNION
      SELECT DATE(MAX(RECEIVED)) DT,
             '' AS CASH_INFO,
             0 AS TOTAL_CASH,    
             INFO OTHER_INFO,
             SUM(IF(TRANS_TYPE = 715, AMOUNT, 0)), -- TOTAL_CHEQUE,
             SUM(IF(TRANS_TYPE = 716, AMOUNT, 0)) -- TOTAL_CREDIT
      FROM PAYMENT
      WHERE LOGIN = 'opensys' 
        AND SOURCE_OF_TRX = '245T2' 
        AND RET_CODE_ID IN (0, 106, 110) 
        AND RECEIVED >= DATE_SUB('2015-09-23 16:30:42', INTERVAL 7 DAY) 
        AND TRANS_TYPE in (715, 716)
      GROUP BY INFO
     ) A
GROUP BY DT, CASH_INFO, OTHER_INFO;

关于mysql - SQL中如何对结果进行分组?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32817870/

相关文章:

php - 从今天开始的 MySQL 日期查找器

mysql - 我的 SQL 计数查询出了什么问题?

sql - 从 select 语句和硬编码值插入表

mysql。选择字段最大的行,按其他字段分组

MySQL Left Join 产生空行

MYSQL 选择、连接、求和和更新多行

mysql - 我可以在不存储分组依据和按值排序的情况下加快此查询吗?

mysql - 博客实现中流行标签的查询是什么?

sql - 将递归函数转换为 View

php - 从哪里选择的查询在 codeigniter 模型中不起作用