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