【问题标题】:MySQL combining COUNT, MAX and SUMMySQL 结合 COUNT、MAX 和 SUM
【发布时间】:2018-06-05 02:14:04
【问题描述】:

在 MySQL 中,我希望有一个额外的列显示特定列的值的总和。但是,我想求和的数字来自子查询,而不是存储在单独的表中,如下所示:

(SELECT a.ID, MAX(a.COUNT_ID) AS MAX_COUNT FROM
    (SELECT ID, COUNT(*) AS COUNT_ID
    FROM my_table
    GROUP BY COL1, COL2) a
 GROUP BY COL1, COL2) b

这会输出类似:

ID     MAX_COUNT
ABC    1
DEF    2
GHI    3

现在,我想要一个额外的列来显示 MAX_COUNT 的总和,如下所示(在所有行上重复):

ID     MAX_COUNT    SUM_MAX_COUNT
ABC    1            6
DEF    2            6
GHI    3            6

实际目标实际上是显示总 MAX_COUNT 的百分比 MAX_COUNT,即 1/6、2/6 和 3/6。 我该怎么做呢?我已经尝试过CROSS JOIN,但它不起作用:

SELECT * FROM
    ((SELECT a.ID, MAX(a.COUNT_ID) AS MAX_COUNT FROM
        (SELECT ID, COUNT(*) AS COUNT_ID
        FROM my_table
        GROUP BY COL1, COL2) a
     GROUP BY COL1, COL2) b
CROSS JOIN (SELECT SUM(b.MAX_COUNT)) AS c

错误:未知表“b”


示例

示例表:

CREATE TABLE TABLE1 (
COL1 varchar(255),
COL2 varchar(255),
DAY int,
HOUR int);

INSERT INTO TABLE1 VALUES
('X','Y',1,12),
('X','Y',1,13),
('X','Y',1,13),
('A','B',2,19),
('X','B',3,13),
('X','B',3,13);

现在我想知道对于 COL1 和 COL2 的每个组合,该表中每小时的行数:

SELECT COL1, COL2, HOUR, COUNT(*) AS COUNT_LINES
FROM TABLE1
GROUP BY DAY, HOUR, COL1, COL2;

哪个输出这个:

COL1    COL2    HOUR    COUNT_LINES
X       Y       12      1
X       Y       13      2
A       B       19      1
X       B       13      2

现在我想要,对于 COL1 和 COL2 的每个组合,COUNT_LINES 的最大值,所以我在子查询中使用上面的查询:

SELECT a.COL1, a.COL2, MAX(a.COUNT_LINES)
FROM 
    (SELECT COL1, COL2, HOUR, COUNT(*) AS COUNT_LINES
    FROM TABLE1
    GROUP BY DAY, HOUR, COL1, COL2) a
GROUP BY COL1, COL2;

哪个输出这个:

COL1    COL2    MAX(COUNT_LINES)
A       B       1
X       B       2
X       Y       2

现在在最后一步,我希望将 MAX(COUNT_LINES) 列的 SUM 放在单独的列中,如下所示:

COL1    COL2    MAX(COUNT_LINES)    SUM(MAX(COUNT_LINES))
A       B       1                   5
X       B       2                   5
X       Y       2                   5

但那是我不知道该怎么做的部分。

【问题讨论】:

  • 能否为my_table添加示例数据和表定义
  • 为什么要再次问同样的问题? stackoverflow.com/questions/47939961/…
  • @vdvaxel - 添加样本数据和预期结果应该可以解决大部分困惑
  • @vdvaxel 。 . .你的问题没有意义。为什么选择id 并通过col1col2 进行聚合?我建议您再问一个问题,并更好地展示您拥有的数据以及您想要的结果。为什么要在子查询中通过col1,col2 聚合,然后在外部查询中通过相同的键进行聚合?
  • @Pரதீப் 在旧版本中 ONLY_FULL_GROUP_BY 默认禁用,另外选择非聚合列结果将是不确定的,请参考我之前评论中的链接以获得更好的理解

标签: mysql sql group-by


【解决方案1】:

试试这个:

SELECT COL1,Max(COUNT_ID),Sum(SUM_MAX_COUNT) FROM(
SELECT COL1,
   Count(*) AS COUNT_ID,
   (SELECT Sum(Count(*))
    FROM   TABLE_NAME
    GROUP BY COL1) AS SUM_MAX_COUNT
FROM   TABLE_NAME
GROUP  BY COL1)
GROUP BY COL1;

【讨论】:

  • 有 2 个 FROM 语句?
【解决方案2】:

为此使用 CTE

with q as
(
  SELECT a.COL1, a.COL2, MAX(a.COUNT_LINES) cmax
  FROM 
    (SELECT COL1, COL2, HOUR, COUNT(*) AS COUNT_LINES
    FROM TABLE1
    GROUP BY DAY, HOUR, COL1, COL2) a
  GROUP BY COL1, COL2
)
SELECT q.*, (SELECT SUM(q.cmax) from q)
FROM q

dbfiddle demo

可以重写(对于较旧的 MySQL)为

SELECT q.*, 
(
  SELECT SUM(cmax) from 
  (
    SELECT a.COL1, a.COL2, MAX(a.COUNT_LINES) cmax
    FROM 
    (SELECT COL1, COL2, HOUR, COUNT(*) AS COUNT_LINES
    FROM TABLE1
    GROUP BY DAY, HOUR, COL1, COL2) a
    GROUP BY COL1, COL2  
  ) q
) as max_sum
FROM 
(
  SELECT a.COL1, a.COL2, MAX(a.COUNT_LINES) cmax
  FROM 
    (SELECT COL1, COL2, HOUR, COUNT(*) AS COUNT_LINES
    FROM TABLE1
    GROUP BY DAY, HOUR, COL1, COL2) a
  GROUP BY COL1, COL2
) q

dbfiddle demo

【讨论】:

  • 不幸的是,MySQL 似乎不支持 WITH 子句
  • 没有其他办法了吗?
  • @vdvaxel 不,我相信没有窗口函数和 CTE,不会
  • 我没有看到对这样的答案投反对票的原因,这两种方法都是有效的,区别在于第一种方法适用于 Mysql 8+
【解决方案3】:

这似乎给出了正确的答案:

mysql-sql> select
       ...     x.col1,
       ...     x.col2,
       ...     x.max_count_lines,
       ...     y.sum_max_count_lines
       ... from
       ...     (  
       ...         select
       ...             a.col1,
       ...             a.col2,
       ...             max(a.count_lines) as max_count_lines
       ...         from 
       ...             (
       ...                 select
       ...                     col1,
       ...                     col2,
       ...                     hour,
       ...                     count(*) as count_lines
       ...                 from
       ...                     table1
       ...                 group by
       ...                     day,
       ...                     hour,
       ...                     col1,
       ...                     col2
       ...              ) a
       ...         group by
       ...              col1,
       ...              col2
       ...     ) x,
       ...     (
       ...         select
       ...             sum(max_count_lines) as sum_max_count_lines
       ...         from
       ...             (  
       ...                 select
       ...                     b.col1,
       ...                     b.col2,
       ...                     max(b.count_lines) as max_count_lines
       ...                 from 
       ...                     (
       ...                         select
       ...                             col1,
       ...                             col2,
       ...                             hour,
       ...                             count(*) as count_lines
       ...                         from
       ...                             table1
       ...                         group by
       ...                             day,
       ...                             hour,
       ...                             col1,
       ...                             col2
       ...                      ) b
       ...                 group by
       ...                      col1,
       ...                      col2
       ...             ) c
       ...     ) y;
+------+------+-----------------+---------------------+
| col1 | col2 | max_count_lines | sum_max_count_lines |
+------+------+-----------------+---------------------+
| A    | B    |               1 |                   5 |
| X    | B    |               2 |                   5 |
| X    | Y    |               2 |                   5 |
+------+------+-----------------+---------------------+
3 rows in set (0.00 sec)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-02-23
    • 1970-01-01
    • 1970-01-01
    • 2011-01-05
    • 1970-01-01
    • 1970-01-01
    • 2019-06-03
    • 1970-01-01
    相关资源
    最近更新 更多