【问题标题】:MYSQL query - getting totals by monthMYSQL 查询 - 按月获取总计
【发布时间】:2012-10-20 14:34:27
【问题描述】:

http://sqlfiddle.com/#!2/6a6b1

上面给出的方案..我想要做的就是将结果作为销售/月的总和...用户将输入开始日期和结束日期,我可以生成(在 PHP 中)整个月和这些日期的年份。例如,如果我想知道 12 个月的“销售”总数,我知道我可以运行 12 个带有开始和结束日期的单独查询,但我只想运行一个查询,结果如下所示:

Month     numofsale
January - 2  
Feb-1
March - 23
Apr - 10

等等……

或者只是一个没有月份的销售列表,然后我可以将它与 PHP 中生成的月份数组配对......任何想法......

编辑/模式和从 sqlfiddle.com 粘贴的数据:

CREATE TABLE IF NOT EXISTS `lead_activity2` (
  `lead_activity_id` int(11) NOT NULL AUTO_INCREMENT,
  `sp_id` int(11) NOT NULL,
  `act_date` datetime NOT NULL,
  `act_name` varchar(255) NOT NULL,
  PRIMARY KEY (`lead_activity_id`),
  KEY `act_date` (`act_date`),
  KEY `act_name` (`act_name`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1  ;

INSERT INTO `lead_activity2` (`lead_activity_id`, `sp_id`, `act_date`, `act_name`) VALUES
(1, 5, '2012-10-16 16:05:29', 'sale'),
(2, 5, '2012-10-16 16:05:29', 'search'),
(3, 5, '2012-10-16 16:05:29', 'sale'),
(4, 5, '2012-10-17 16:05:29', 'DNC'),
(5, 5, '2012-10-17 16:05:29', 'sale'),
(6, 5, '2012-09-16 16:05:30', 'SCB'),
(7, 5, '2012-09-16 16:05:30', 'sale'),
(8, 5, '2012-08-16 16:05:30', 'sale'),
(9, 5,'2012-08-16 16:05:30', 'sale'),
(10, 5, '2012-07-16 16:05:30', 'sale');

【问题讨论】:

  • 我看到创建表和插入虚拟数据代码,你为'select'语句尝试了什么?

标签: mysql query-optimization


【解决方案1】:
SELECT DATE_FORMAT(date, "%m-%Y") AS Month, SUM(numofsale)
FROM <table_name>
WHERE <where-cond>
GROUP BY DATE_FORMAT(date, "%m-%Y") 

在你的小提琴演示中检查以下它对我有用(删除 where 子句进行测试)

SELECT DATE_FORMAT(act_date, "%m-%Y") AS Month, COUNT(*)
FROM lead_activity2
WHERE <where-cond-here> AND act_name='sale'
GROUP BY DATE_FORMAT(act_date, "%m-%Y") 

返回如下结果

MONTH   COUNT(*)
07-2012 1
08-2012 2
09-2012 1
10-2012 3

【讨论】:

  • 您可以将DATE_FORMAT(act_date, "%M-%Y") 用于July-2012 参考:- dev.mysql.com/doc/refman/5.5/en/…
  • 销售数字为零的月份不会显示在结果中
  • 为什么不GROUP BY Month
  • 这将按月份显示全年的总销售额,但是如果有人需要在特定年份显示它,只需在&lt;where-cond-here&gt;中添加YEAR(act_date) = 2012
【解决方案2】:

您可以尝试如下查询

select  SUM(`SP_ID`) AS `Total` , DATE_FORMAT(act_date, "%M") AS Month, Month(`ACT_DATE`) AS `Month_number` from `lead_activity2`  WHERE `ACT_DATE` BETWEEN '2012-05-01' AND '2012-12-17' group by Month(`ACT_DATE`)

这里2012-05-012012-12-17 是从表单输入的日期。如果数据库中存在,它将返回特定月份的销售额总和。

谢谢

【讨论】:

    【解决方案3】:

    试试这个查询 -

    SELECT
      MONTH(act_date) month, COUNT(*)
    FROM
      lead_activity2
    WHERE
      YEAR(act_date) = 2012 AND act_name = 'sale'
    GROUP BY
      month
    

    检查 WHERE 条件是否适合您 - act_name = 'sale'

    如果要输出月份名称,请使用 MONTHNAME() 函数而不是 MONTH()

    【讨论】:

    • 我厌倦了这个 SELECT EXTRACT(MONTH FROM act_date) 作为月份,EXTRACT(YEAR FROM act_date) 作为年份,COUNT(*) FROM lead_activity2 WHERE act_name="sale" GROUP BY month, year ORDER BY年DESC,月DESC
    • 开发您的查询工作......但我想我发布的解决方案是一个更完整的解决方案,因为它似乎一直在进行排序和东西.....会选择你的
    【解决方案4】:
    SELECT YEAR(act_date), MONTH(act_date), COUNT(*)
    
    FROM lead_activity2
    
    GROUP BY YEAR(act_date), MONTH(act_date)
    

    要按月获取数据或基于列的任何其他数据,您必须添加 GROUP BY。

    您可以将许多列或计算值添加到 GROUP BY。

    我假设“销售额”是指行数。

    【讨论】:

      【解决方案5】:

      有时您可能希望月份名称为 Jan、Feb、Mar .... Dec 可能用于类似FusionChart 的图表

      SELECT DATE_FORMAT(date, "%M") AS Month, SUM(numofsale)
      FROM <Table_name>
      GROUP BY DATE_FORMAT(date, "%M")
      

      结果在桌子上看起来像这样

      MONTH   COUNT(*)
      Jul       1
      Aug       2
      SEP       1
      OCT       3
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-04-13
        • 1970-01-01
        • 2020-01-17
        • 2021-11-08
        相关资源
        最近更新 更多