Php 将数据分隔为一周中的几天

Php 将数据分隔为一周中的几天,php,mysql,Php,Mysql,你好 我目前正在制作一份销售跟踪报告,用户在其中选择一个日期范围,然后表格将显示结果 现在,我有一个查询,它统计售出的商品数量 select x_transaction_details.xitem, SUM(x_transaction_details.qty) as totalNumberSold, count(x_transaction_details.xitem) as occurence, x_transaction_details.cost

你好

我目前正在制作一份销售跟踪报告,用户在其中选择一个日期范围,然后表格将显示结果

现在,我有一个查询,它统计售出的商品数量

select x_transaction_details.xitem, 
       SUM(x_transaction_details.qty) as totalNumberSold, 
       count(x_transaction_details.xitem) as occurence, 
       x_transaction_details.cost, 
       i_inventory.xitem, 
       x_transaction_details.date_at as transDate
from x_transaction_details
   left join i_inventory on x_transaction_details.xitem = i_inventory.xid
where (x_transaction_details.date_at BETWEEN '2015-08-13 08:34:12' AND '2015-09-14 08:34:12')
GROUP BY x_transaction_details.xitem
ORDER BY occurence DESC
此查询显示

|itemName| totalNumberSold | occurence | date
|item 1  | 23 pcs          |  2        |
|item 2  | 18 pcs          |  6        |
|item 3  | 203 pcs         |  18       |
etc..
现在我想知道每天的销售额明细,所以我试了一下

select x_transaction_details.xitem, 
       SUM(x_transaction_details.qty) as sold, 
       count(x_transaction_details.xitem) as occurence,
       x_transaction_details.cost, 
       i_inventory.xitem, 
       x_transaction_details.date_at as transDate
       SUM(CASE WHEN date_at = DAYOFWEEK(1) THEN    
                 count(x_transaction_details.xitem) END) as Sunday
from x_transaction_details
  left join i_inventory on x_transaction_details.xitem = i_inventory.xid
where (x_transaction_details.date_at BETWEEN '2015-08-13 08:34:12' AND '2015-09-14 08:34:12')
GROUP BY x_transaction_details.xitem
ORDER BY occurence DESC
但它却产生了一个错误。我想创建一个更详细的表

|itemName|Mon|Tue|Wed|Thur|Fri|Sat|Sun| totalNumberSold | occurence | date
|item 1  | 10|  0| 0 | 13 | 0 |0  |0  | 23 pcs          |  2        |
|item 2  | 1 |  3| 12|  0 | 16|0  |0  | 32 pcs          |  6        |
|item 3  | 0 |  6| 1 | 13 | 8 |7  |1  | 36 pcs          |  12       |
etc..

感谢这些提示,我也可以使用php(硬方法)创建这个表,但我想使用sql查询也是可行的。祝您愉快。

您缺少逗号和嵌套聚合函数。我想你想要:

select i.xid, SUM(td.qty) as sold, count(td.xitem) as occurrence,
       avg(td.cost) as avg_cost, i.xitem,
       SUM(case when DAYOFWEEK(td.date_at) = 1 then td.qty else 0 end) as Sunday
from i_inventory i join
     x_transaction_details td       
     on td.xitem = i.xid
where td.date_at BETWEEN '2015-08-13 08:34:12' AND '2015-09-14 08:34:12'
GROUP BY i.xid
ORDER BY occurrence DESC;
注:

  • “事件”有两个r
  • 表别名使查询更易于编写和读取
  • 不能嵌套聚合函数
  • 您不应该在
    select
    列表中包含
    date\u at
    ,因为每行的值不是唯一的
  • 左连接
    要么是向后的(库存应该先进行),要么应该是
    内部连接
    。在格式正确的数据库中,事务表中不应该有不在库存表中的项(我不认为)
  • 实际代码(可能对任何人都有帮助)


    不过我没有使用表别名:)

    你可以使用条件聚合,比如
    SUM(DAYOFWEEK(date_at)=1然后x_transaction_details.qty ELSE 0 END)作为星期天
    是的,这是我首先要做的,但我不知道格式是什么,所以我得到了一个错误。。谢谢你,先生:)看看下面戈登的答案,它的语法在所有的星期都是一样的。您只需要为每个工作日使用一个单独的表达式,并对其进行条件聚合。感谢您的回答,sir@GordonLinoff,是的,事务表上不应该有不在库存表上的项目,但是我想首先查询事务表对我来说更有效,因为它没有必要每次都检查所有库存项目。它基于用户选择的交易日期范围。您将成本和项目保留为非聚合。我怀疑这也是错误的。hello@shawnt00抱歉,我只是想将“SUM(case when DAYOFWEEK(td.date_at)=1然后td.qty else 0 end)作为星期日”代码。事实上,我在发布代码时并没有真正清理代码:)@melvnberd。你应该使用一个内部连接,让MySQL进行优化。谢谢你的提示,先生@GordonLinoff,我会研究一下:)我从那以后就没有使用过内部连接!hahaI认为您可能应该从输出中删除以下列:x_transaction_details.cost、i_inventory.xitem、,x_transaction_details.date_at as transdateoh ok@shawnt00虽然“i_inventory.xitem”指的是项目的实际名称,“x_transaction_details.xitem”指的是i_inventory表上的项目ID,您应该养成使用
    min
    max
    的习惯,即使组中的所有值都是相同的一样。您所做的可能会对成本和名称产生影响,但
    date\u at
    不会。非常感谢您给我一些提示:)我还不擅长优化查询,因此非常感谢。顺便说一句简而言之,最小值/最大值做什么?这真的有用吗?例如,在我的例子中,.他们的关键是要理解,
    groupby
    必须将多行中的值压缩为每个组的单个值。有些系统,如MySQL,允许您以您所做的方式引用列,但无法预测返回的值,因此这是一种不好的做法。所有相同值的最小值/最大值为值本身,但在符合标准的系统上仍然需要“虚拟”聚合。
    select x_transaction_details.xitem, count(x_transaction_details.xitem) as occurrence, i_inventory.xitem,
    SUM(case when DAYOFWEEK(x_transaction_details.date_at) = 1 then x_transaction_details.qty else 0 end) as Sun,
    SUM(case when DAYOFWEEK(x_transaction_details.date_at) = 2 then x_transaction_details.qty else 0 end) as Mom,
    SUM(case when DAYOFWEEK(x_transaction_details.date_at) = 3 then x_transaction_details.qty else 0 end) as tue,
    SUM(case when DAYOFWEEK(x_transaction_details.date_at) = 4 then x_transaction_details.qty else 0 end) as wed,
    SUM(case when DAYOFWEEK(x_transaction_details.date_at) = 5 then x_transaction_details.qty else 0 end) as thur,
    SUM(case when DAYOFWEEK(x_transaction_details.date_at) = 6 then x_transaction_details.qty else 0 end) as fri,
    SUM(case when DAYOFWEEK(x_transaction_details.date_at) = 7 then x_transaction_details.qty else 0 end) as sat,
    SUM(x_transaction_details.qty) as totalNumberSold
    from x_transaction_details
    left join i_inventory on x_transaction_details.xitem = i_inventory.xid
    where (x_transaction_details.date_at BETWEEN '2015-08-13 08:34:12' AND '2015-09-14 08:34:12')
    GROUP BY x_transaction_details.xitem
    ORDER BY occurrence DESC