Это, кажется, дает правильный ответ:

QL я хотел бы иметь дополнительный столбец, показывающий сумму значений определенного столбца. Однако числа, которые я хотел бы суммировать, взяты из подзапроса и не хранятся в отдельной таблице, что-то вроде этого:

(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

Теперь на последнем шаге я хочу, чтобы столбец SUM of MAX (COUNT_LINES) находился в отдельном столбце, например так:

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

Но это та часть, которую я не знаю, как сделать.

 Pரதீப்22 дек. 2017 г., 13:14
@vdvaxel - добавление образцов данных и ожидаемого результата должно решить большую часть путаницы
 Gordon Linoff22 дек. 2017 г., 13:16
@vdvaxel. , , Ваш вопрос не имеет смысла. Почему вы выбираетеid и агрегированиеcol1 а такжеcol2? Я бы посоветовал вам задать другой вопрос и лучше показать данные, которые у вас есть, а также желаемые результаты. Зачем вам агрегировать поcol1,col2 в подзапросе, а затем агрегировать по тем же ключам во внешнем запросе?
 M Khalid Junaid22 дек. 2017 г., 13:09
Можете ли вы добавить пример данных и определение таблицы дляmy_table
 M Khalid Junaid22 дек. 2017 г., 13:17
@P ரதீப் в старых версияхONLY_FULL_GROUP_BY по умолчанию отключено, также, чтобы выбрать неагрегированный столбец, результат будет неопределенным, пожалуйста, обратитесь к ссылке в моем предыдущем комментарии для лучшего понимания
 jarlh22 дек. 2017 г., 13:11
Зачем задавать тот же вопрос еще раз?stackoverflow.com/questions/47939961/...

Ответы на вопрос(3)

Используйте 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

который может быть переписан (для более старых 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

 M Khalid Junaid22 дек. 2017 г., 14:19
Я не вижу причин такого голосования, оба подхода верны, разница в том, что первый подход будет работать в Mysql 8+
 vdvaxel22 дек. 2017 г., 13:57
К сожалению, MySQL не поддерживает предложение WITH
 Radim Bača22 дек. 2017 г., 14:06
@vdvaxel нет, я считаю, что без оконных функций и CTE, а не
 Radim Bača22 дек. 2017 г., 14:00
@vdvaxel хорошо, смотрите редактирование
 vdvaxel22 дек. 2017 г., 14:05
Нет другого способа сделать это?

Это, кажется, дает правильный ответ:

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)

Попробуй это:

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;
 S_sauden22 дек. 2017 г., 14:31
меня устраивает.
 vdvaxel22 дек. 2017 г., 14:11
Есть 2 ОТ заявления?
 vdvaxel22 дек. 2017 г., 14:04
Это не работает
 S_sauden22 дек. 2017 г., 14:10
Что за ошибка

Ваш ответ на вопрос