【发布时间】: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并通过col1和col2进行聚合?我建议您再问一个问题,并更好地展示您拥有的数据以及您想要的结果。为什么要在子查询中通过col1,col2聚合,然后在外部查询中通过相同的键进行聚合? -
@Pரதீப் 在旧版本中
ONLY_FULL_GROUP_BY默认禁用,另外选择非聚合列结果将是不确定的,请参考我之前评论中的链接以获得更好的理解