mysql - 如何计算老化报告的月销售额
问题描述
这相当简单,我有一个包含发票行的表格,包括发票编号、项目编号和数量。我想看看过去 18 个月,并计算出我们以 30 天为增量卖出了多少特定商品。
select
invlines.
i-no ,
@days_sold := DATEDIFF(CURDATE(), invlines.
inv-date ) AS days_sold,
SUM(IF(@days_sold BETWEEN 1 AND 30, invlines.
qty , 0)) as Month1,
SUM(IF(@days_sold BETWEEN 31 AND 60, invlines.
qty , 0)) as Month2,
SUM(IF(@days_sold BETWEEN 61 AND 90, invlines.
qty , 0)) as Month3,
SUM(IF(@days_sold BETWEEN 91 AND 120, invlines.
qty , 0)) as Month4,
SUM(IF(@days_sold BETWEEN 121 AND 150, invlines.
qty , 0)) as Month5,
SUM(IF(@days_sold BETWEEN 151 AND 180, invlines.
qty , 0)) as Month6,
SUM(IF(@days_sold BETWEEN 181 AND 210, invlines.
qty , 0)) as Month7,
SUM(IF(@days_sold BETWEEN 211 AND 240, invlines.
qty , 0)) as Month8,
SUM(IF(@days_sold BETWEEN 241 AND 270, invlines.
qty , 0)) as Month9,
SUM(IF(@days_sold BETWEEN 271 AND 300, invlines.
qty , 0)) as Month10,
SUM(IF(@days_sold BETWEEN 301 AND 330, invlines.
qty , 0)) as Month11,
SUM(IF(@days_sold BETWEEN 331 AND 360, invlines.
qty , 0)) as Month12,
SUM(IF(@days_sold BETWEEN 361 AND 390, invlines.
qty , 0)) as Month13,
SUM(IF(@days_sold BETWEEN 391 AND 420, invlines.
qty , 0)) as Month14,
SUM(IF(@days_sold BETWEEN 421 AND 450, invlines.
qty , 0)) as Month15,
SUM(IF(@days_sold BETWEEN 451 AND 480, invlines.
qty , 0)) as Month16,
SUM(IF(@days_sold BETWEEN 481 AND 510, invlines.
qty i-no inv-date i- , 0)) as Month17,
SUM(IF(@days_sold BETWEEN 511 AND 540, invlines.
no``, 0)) as Month18
from invlines
where invlines.
="10 37148" and invlines.
between (NOW() - INTERVAL 540 DAY) AND NOW()
GROUP BY invlines.
我得到的是 Month18 列中的一个数量,但在任何其他 Month 列中都没有。我在另一份报告中使用了一个非常相似的解决方案,它工作正常,但无法弄清楚为什么这个不工作。
解决方案
也许你在这样的事情
CREATE TABLE `invlines` (
`i-no` varchar(11) NOT NULL,
`inv-date` datetime NOT NULL,
`qty` int(10) NOT NULL
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
INSERT INTO `invlines` (`i-no`, `inv-date`, `qty`) VALUES
('10 37148', '2019-07-07 08:00:00', '1'),
('10 37148', '2019-07-07 07:00:00', '1'),
('10 37148', '2019-06-01 08:00:00', '1'),
('10 37148', '2019-06-02 08:00:00', '1'),
('10 37148', '2019-05-02 08:00:00', '1'),
('10 37148', '2019-05-01 08:00:00', '1'),
('10 37148', '2019-04-07 08:00:00', '1'),
('10 37148', '2019-04-02 08:00:00', '1'),
('10 37148', '2019-03-02 08:00:00', '1'),
('10 37148', '2019-03-01 08:00:00', '1');
Select `i-no`,Sum(month1),SUM(month2),SUM(month3) From
(Select `i-no`,
CASE WHEN ( DATEDIFF(Now(), `inv-date`) > 0
and DATEDIFF(Now(), `inv-date`) < 30) then SUM(qty) END as month1,
CASE WHEN ( DATEDIFF(Now(), `inv-date`) >= 30
and DATEDIFF(Now(), `inv-date`) < 60) then SUM(qty) END as month2,
CASE WHEN ( DATEDIFF(Now(), `inv-date`) >= 60
and DATEDIFF(Now(), `inv-date`) < 90) then SUM(qty) END as month3
From invlines
Group by floor(datediff(Now(), `inv-date`) / 30)) a
Group by `i-no`;
结果
i-no Sum(month1) SUM(month2) SUM(month3)
10 37148 2 2 2
推荐阅读
- flask - gcloud 部署失败“应用程序中的错误:/ [POST] 上的异常”
- javascript - JavaScript index.js .babelrc 错误“不要克隆评论...
... } 无法克隆” - c++ - poco 切换到 MT 链接错误 Visual Studio 2019
- google-sheets - Google 表格 ImportXML 返回“未找到 URL 处的资源”错误
- angular - 如何一次从 Firestore 获取所有文档?
- ruby-on-rails - Bootstrap 4 - 下拉菜单无法与移动菜单一起正常工作
- flutter - 具有 null 安全性的 Flutter 条件渲染
- javascript - “POST”后模态不隐藏且数据不显示
- python - 在 PySpark 中,从一个数据帧中删除与第二个数据帧中的行匹配的行
- function - 为什么不能像 OCaml 中的常规函数那样传递数据构造函数?