#mysql #sql #select #group-by #count
#mysql #sql #выберите #группировать по #количество
Вопрос:
halo, я хочу добавить id
затем group by
product и date hour(без изменения datetime на varchar). с данными:
datetime product sold
2020-10-27 08:51:00 A 50
2020-10-27 08:52:00 A 10
2020-10-27 08:52:00 B 20
2020-10-27 09:52:00 B 30
мой запрос:
select newId() as id, datehour(datetime) datehour, product, sum(sold)
from table_a
group by datehour(datetime), product
но не сработало
мой ожидаемый результат:
примечание: дата час должен иметь тип datetime, а не varchar
id datehour product sold
1 2020-10-27 08:00:00 A 60
2 2020-10-27 08:00:00 B 20
3 2020-10-27 09:00:00 B 30
примечание: дата час должен иметь тип datetime, а не varchar
есть идеи?
Комментарии:
1.
datehour
Вы что-то написали? Является ли степень «не сработал» типом datehour или есть что-то еще неправильное.2. Что такое
newId()
?3. Какую версию MySQL вы используете?
4. @Nick я использую mysql workbench, newId — это номер строки (он должен быть последовательным)
5. Не workbench, это MySQL 8.0 или 5.x?
Ответ №1:
Непонятно, чего вы пытаетесь достичь newId()
. Кроме этого, вы можете получить желаемый результат, используя DATE_FORMAT
и STR_TO_DATE
, чтобы отделить минуты и секунды от времени, чтобы получить datehour
значение; затем вы можете GROUP BY
использовать и product
и SUM
sold
значения:
SELECT STR_TO_DATE(DATE_FORMAT(`datetime`, '%Y-%m-%d %H'), '%Y-%m-%d %H') AS datehour,
product,
SUM(sold) AS sold
FROM table_a
GROUP BY datehour, product
Вывод:
datehour sold product
2020-10-27 08:00:00 60 A
2020-10-27 08:00:00 20 B
2020-10-27 09:00:00 30 B
С точки зрения генерации id
значения, если вы используете MySQL 8 , вы можете использовать ROW_NUMBER()
:
SELECT ROW_NUMBER() OVER (ORDER BY datehour, product) AS id,
datehour,
product,
sold
FROM (
SELECT STR_TO_DATE(DATE_FORMAT(`datetime`, '%Y-%m-%d %H'), '%Y-%m-%d %H') AS datehour,
product,
SUM(sold) AS sold
FROM table_a
GROUP BY datehour, product
) a
ORDER BY id
Для MySQL 5.x вы можете имитировать ROW_NUMBER()
с помощью переменной:
SELECT @rn := @rn 1 AS id,
datehour,
product,
sold
FROM (
SELECT STR_TO_DATE(DATE_FORMAT(`datetime`, '%Y-%m-%d %H'), '%Y-%m-%d %H') AS datehour,
product,
SUM(sold) AS sold
FROM table_a
GROUP BY datehour, product
ORDER BY datehour, product
) a
CROSS JOIN (SELECT @rn := 0) i
В обоих случаях вывод:
id datehour product sold
1 2020-10-27 08:00:00 A 60
2 2020-10-27 08:00:00 B 20
3 2020-10-27 09:00:00 B 30
Комментарии:
1. его работа для меня, является ли столбец datehour типом datetime? @Nick
2. @hinafaya да, это так
3. @hinafaya Я добавил еще два запроса (один для MySQL 8 , один для MySQL 5.x), которые будут генерировать
id
нужное вам значение.4. спасибо @Nick, запрос для mysql 8 работает для меня, superbbb