【问题标题】:CodeIgniter SQL query - how to sum values for each month?CodeIgniter SQL 查询 - 如何对每个月的值求和?
【发布时间】:2011-03-21 02:33:37
【问题描述】:

我有下表:

//table_1

record_id   user_id    plant_id    date        cost
1           1          1           2011-03-01   10
2           1          1           2011-03-02   10
3           1          1           2011-04-10   5
4           1          2           2011-04-15   5

我想构建一个查询(如果可能的话,使用 CI Active Records,但 MySQL 没问题),我会在其中生成以下结果:

[1] => [1] => [March 2011] [20]

           => [April 2011] [5]

       [2] => [March 2011] [0]

           => [April 2011] [5]

我尝试过使用$this->db->group_by,但我认为我没有正确使用它。

如果有人能给我一个指导或路线图来完成这项工作,将不胜感激——谢谢!

【问题讨论】:

    标签: php mysql codeigniter activerecord


    【解决方案1】:

    示例表

    drop table if exists t;
    create table t( record_id int, user_id int, plant_id int, date datetime, cost float);
    insert t select
    1 ,1, 1 ,'2011-03-01', 10 union all select
    2 ,1, 1 ,'2011-03-02', 10 union all select
    3 ,1, 1 ,'2011-04-10', 5 union all select
    4 ,1, 2 ,'2011-04-15', 5;
    

    因为要查看 0 的行,所以需要在年月和所有用户工厂之间进行交叉连接。

    select up.user_id, up.plant_id, ym2, ifnull(sum(t.cost),0) totalcost
    from (select distinct date_format(date, '%Y-%m') ym, date_format(date, '%M %Y') ym2 from t) dates
    cross join (select distinct t.user_id, t.plant_id from t) up
    left join t on date_format(t.date, '%Y-%m') = dates.ym
               and up.user_id=t.user_id
                and up.plant_id=t.plant_id
    group by up.user_id, up.plant_id, ym2, ym
    order by up.user_id, up.plant_id, date(concat(ym,'-1'));
    

    Month Year 没有正确排序这一事实还需要对日期进行复杂的处理,以便在最后进行排序。

    【讨论】:

    • @cyberkiwi -- Holysh*t!该代码在我的脑海中,但它在我的终端上运行得很好——我想我会以原始 SQL 的形式运行它的一些变体,因为我认为没有办法完全移植到 CI ActiveRecords——非常感谢!
    • 其实只是将上面的SQL代码封装在$this->db->query("code")中——再次感谢您的帮助
    • @cyberkiwi - 如果有一个名为 category 的附加列,并且我想只过滤带有 category = 1 的结果 - 我应该在上面的代码中在哪里插入 where 子句?
    • @torr 在AND category.... 分组之前,也可能在别名为up 的子查询中,..t.plant_id from t where ...) up
    • @ck - 绝对完美!我根据你上面的代码发布了另一个问题,因为我需要加入另一个表——如果你有时间,应该是一些简单的点! => link -- 谢谢!
    【解决方案2】:

    这是一种非常强大的方法,如果您需要经常进行这些查询,最好将月份-年份存储为列本身,但这基本上是它的工作原理:

    SELECT CONCAT(MONTHNAME(date), ' ', YEAR(date)) AS monthyear, COUNT(*) AS count GROUP BY YEAR(date), MONTH(date), plant_id;
    

    这应该会为您提供所需的结果集。

    【讨论】:

    • 感谢@michael - monthyear 是否会成为CONCAT 将存储其结果的表中的新空列?或者monthyear 是用户输入其工厂数据时填充的列?
    • 很抱歉,如果不是很清楚。上面的查询不需要修改表本身。但是,使用新字段的概念会减轻 DB 的一些压力。基本上,您将创建一个名为“月”的列,其类型为 DATE,您只需在 INSERT 上填充该列。它的值是CONCAT(YEAR(NOW()), '-', MONTH(NOW()), '-01')
    • mctiernan -- 你的解决方案似乎比上面的@ck 更容易执行,所以我对你要说的话很感兴趣 -- 但我无法让它在我的终端上运行 -- 比如说我正在使用上面建议的表@ck——当我运行你的SQL时,我在GROUP BY YEAR(date) MONTH(date), plant_id附近得到一个错误——我有什么遗漏吗?在运行您的代码之前我需要添加任何字段吗?
    • 哈哈。好吧,如果你直接复制和粘贴,我完全忘记了我的选择查询中的表格(这很尴尬。应该是SELECT ... FROM table_1 GROUP BY YEAR(date), MONTH(date), plant_id
    • 你是对的 - 现在它运行了,但结果不是我所期望的 - 它给了我 March 2011 - 2 April 2011 - 1 April 2011 - 1 - 所以问题是它在四月重复并且正在计数每个月的事件数,而不是对 cost 字段求和
    猜你喜欢
    • 2016-04-10
    • 1970-01-01
    • 1970-01-01
    • 2020-06-28
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-01-22
    • 1970-01-01
    相关资源
    最近更新 更多