【问题标题】:MySQL show records month wiseMySQL 按月显示记录
【发布时间】:2020-05-02 04:51:23
【问题描述】:

我的数据库表中有一些记录。

用户传递开始和结束日期,然后期望输出。如果用户通过了同一个月的开始日期和结束日期,那么它应该只显示一条记录,但如果结束日期延长一个月或更多个月,那么它应该显示月份明智的记录。

现在我可以在执行此查询时收集总数据。

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,但没有帮助。

我该怎么做?

任何帮助将不胜感激。

【问题讨论】:

  • 如果没有 GROUP BY 子句,并且在 SELECT 列表中使用 SUM() 聚合,查询将不会返回超过一行。 (如果 sql_mode 包含 ONLY_FULL_GROUP_BY 则 MySQL 将为此查询返回错误,行为与标准和大多数其他 RDBMS Oracle、SQL Server、Teradata 等更一致。MySQL 特定扩展允许查询返回行,但返回的值对于 SELECT 列表中的非聚合表达式 (cust_id, msn) 是 indeterminate。这些值将从折叠组中的某些行返回,但不能保证是哪一行。)

标签: mysql datetime sum


【解决方案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") 作为 monYear FROM mdc_meters_data m WHERE m.data_date_time >= 2020-04-01 00:00:00' AND m.data_date_time`

希望对你有所帮助

【讨论】:

  • 查询没有返回正确的结果。当我尝试从m.data_date_time &gt;='2020-04-01 00:00:00' AND m.data_date_time&lt;='2020-05-31 00:00:00' 传递日期时间时,2020-04-01 的总和是4013202020-05-31 的总和是84220,但是当我通过日期时间m.data_date_time &gt;='2020-04-01 00:00:00' AND m.data_date_time&lt;='2020-04-30 00:00:00' 时,总和是370570。这是为什么呢?
  • 请把你的桌子放好
【解决方案2】:

请检查这个答案

    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'

【讨论】:

  • 它给了我错误。 You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'table AS r JOIN
【解决方案3】:

您必须以正确的方式使用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分组

一种解决方法是在选择列表中的非聚合MSN 列周围使用any_value 函数。这只会从匹配列表中选择任何 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

另外,请注意 5 月 31 日是如何包含在您的查询中的,方法是将范围扩展到时间 23:59:59。

【讨论】:

  • Incorrect parameters in the call to stored function 'any_value' 它给了我这个错误
  • 答案已编辑。你应该已经意识到如何让它工作。
  • 现在它给了我FUNCTION mdc_db.any_value does not exist
  • any_value 是一个标准的mysql函数。如果您的服务器找不到它,则说明您的服务器有问题。 riptutorial.com/mysql/example/26731/any-value--
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-04-26
  • 2011-06-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多