将数据分成几周的几天mysql

时间:2015-09-26 13:13:45

标签: 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, 
       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查询。祝你有个美好的一天。

2 个答案:

答案 0 :(得分:2)

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

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。
  • 表别名使查询更易于编写和阅读。
  • 您无法嵌套聚合函数。
  • 您不应在date_at列表中包含select,因为该值对于每一行都不是唯一的。
  • left join要么向后(库存应该先行),要么应该是inner join。在正确形成的数据库中,您不应该在事务表中具有不在库存表中的项目(我不认为)。

答案 1 :(得分:1)

实际代码(可能对任何人都有帮助)

glutWireCube

虽然我没有使用表别名:)