问题
I have some records in my Database table.
User passes the start and the end date and then expects an output. If a user passes the start and end date for same month then it should show only one record, but if the end date is extended one or more month then it should displays month wise record.
For now I am able to collect total data while following this query.
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'
Output
Data_Date_Time == total_kwh == Customer_ID == MSN
2020-04-01 11:44:13 || 95585 || 37010114707 || 7898985212
Expected Output
As the month end date is 05
so it should show two records like below
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
I have tried to put GroupBy data_date_time
but it doesn't helped me out.
How can I do this ?
Any help would be highly appreciated.
回答1:
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, date_format(data_date_time, "%Y-%m") as monYear
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' group by monYear
Hope it will help you for getting idea
回答2:
please check this answer
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'
回答3:
You will have to use GROUP BY
the correct manner.
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
Now the problem with the above query is that you don't need to group your results by MSN
One workaround is to use any_value
function around your nonaggregated MSN
columns in the select list. This will just pick any MSN
value from the matching list and make sure you will still have only 2 entries shown in the results.
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
Also, note how the 31st of May has been included in your query by giving by extending the range to the time 23:59:59.
来源:https://stackoverflow.com/questions/61554627/mysql-show-records-month-wise