MySQL показать записи по месяцам - PullRequest
0 голосов
/ 02 мая 2020

У меня есть несколько записей в моей таблице базы данных.

Пользователь передает дату начала и окончания, а затем ожидает вывод. Если пользователь передает начальную и конечную дату для одного и того же месяца, он должен показывать только одну запись, но если конечная дата продлевается на один или более месяцев, он должен отображать запись с разбивкой по месяцам.

На данный момент я могу собирать полные данные при выполнении этого запроса.

SELECT m.data_date_time
     , SUM(m.kwh) total_kwh
     , m.cust_id Customer_ID
     , m.msn
  FROM mdc_meters_data m 
 WHERE m.data_date_time >= '2020-04-01 00:00:00' 
   AND m.data_date_time <= '2020-05-31 00:00:00'

Выход

Data_Date_Time      == total_kwh == Customer_ID == MSN
2020-04-01 11:44:13 || 95585     || 37010114707 || 7898985212

Ожидаемый результат

Поскольку дата окончания месяца равна 05, то это должно показать две записи, как показано ниже

Data_Date_Time      == total_kwh == Customer_ID == MSN
2020-04-01 11:44:13 || 50000     || 37010114707 || 7898985212
2020-05-01 10:25:05 || 45585     || 37010114707 || 7898985212

Я пытался поставить GroupBy data_date_time, но это не помогло мне.

Как я могу это сделать?

Любая помощь будет принята с благодарностью.

Ответы [ 3 ]

0 голосов
/ 02 мая 2020

пожалуйста, проверьте этот ответ

    SELECT m.`data_date_time` AS 'Data_Date_Time', SUM(m.`kwh`) AS total_kwh, m.`cust_id` AS 'Customer_ID', m.`msn` AS MSN 
FROM table AS r JOIN (
        SELECT MAX(m.`data_date_time`) AS data_date_time
        FROM table AS t
        GROUP BY YEAR(m.`data_date_time`), MONTH(t.data_date_time)
    ) AS x USING (data_date_time)

`mdc_meters_data` m WHERE m.`data_date_time`>='2020-04-01 00:00:00' AND m.`data_date_time`<='2020-05-31 00:00:00'
0 голосов
/ 02 мая 2020

Вы должны будете использовать GROUP BY в правильном порядке.

SELECT DATE_FORMAT('m.`data_date_time`, '%Y-%m') AS Data_Date_Time, 
       SUM(m.`kwh`) AS total_kwh, 
       m.`cust_id` AS Customer_ID,
       m.`msn` AS MSN 
FROM `mdc_meters_data` m 
WHERE m.`data_date_time`>='2020-04-01 00:00:00' AND m.`data_date_time`<='2020-05-31 23:59:59'
GROUP BY Customer_ID, Data_Date_Time, MSN

Теперь проблема с вышеуказанным запросом заключается в том, что вам не нужно группировать результаты по MSN

Один из способов - использовать функцию any_value для вашей неагрегированной MSN столбцов в списке выбора. Это просто выберет любое значение MSN из списка совпадений и убедитесь, что в результатах останутся только 2 записи.

SELECT any_value(DATE_FORMAT('m.`data_date_time`, '%Y-%m')) AS Data_Date_Time, 
       SUM(m.`kwh`) AS total_kwh, 
       m.`cust_id` AS Customer_ID,
       any_value(m.`msn`)
FROM `mdc_meters_data` m 
WHERE m.`data_date_time`>='2020-04-01 00:00:00' AND m.`data_date_time`<='2020-05-31 23:59:59'
GROUP BY Customer_ID, Data_Date_Time

Также обратите внимание на то, как 31 мая было включено в ваш список. запросить, расширив диапазон до времени 23: 59: 59.

0 голосов
/ 02 мая 2020

ВЫБРАТЬ м. data_date_time AS 'Data_Date_Time', SUM (м. kwh) AS total_kwh, м. cust_id AS "Customer_ID", м. msn AS MSN, дата_формат (data_date_time, "% Y) -% m ") как monYear ОТ mdc_meters_data m ГДЕ m. data_date_time >= 2020-04-01 00:00:00' AND m. data_date_time` <= '2020-05-31 00:00:00' группа по monYear </p>

Надеюсь, это поможет вам получить идея

...