Mysql 比较%中的行值以测量增长
我正在我的数据库中存储一种类型的每周值,让我们看看每个用户的订单 所以我有Mysql 比较%中的行值以测量增长,mysql,sql,Mysql,Sql,我正在我的数据库中存储一种类型的每周值,让我们看看每个用户的订单 所以我有 1. Tim | 10 | 1 2. Tim | 20 | 2 2. Bob | 10 | 1 2. Bob | 25 | 2 Tim在第一周卖出了10件商品,在第二周卖出了20件 Bob在第1周有10个sols项目,第2周有25个sols项目 现在,我正在尝试创建一个mysql查询,我可以在php中使用该查询创建一个表,结果如下: Tim: 10 > 20 (100%) Bob: 10 > 25 (15
1. Tim | 10 | 1
2. Tim | 20 | 2
2. Bob | 10 | 1
2. Bob | 25 | 2
Tim在第一周卖出了10件商品,在第二周卖出了20件
Bob在第1周有10个sols项目,第2周有25个sols项目
现在,我正在尝试创建一个mysql查询,我可以在php中使用该查询创建一个表,结果如下:
Tim: 10 > 20 (100%)
Bob: 10 > 25 (150%)
我最好只使用一个查询来保存数据库,而不是每个用户使用几个查询的循环
编辑:
我没有确切的周数,我只有时间戳,我想比较2个最新的。这就是我现在所拥有的,但给出了一个错误:
SELECT userid,
(select sold order by sold limit 0,1) as last,
(select sold order by sold limit 1,1) as semilast
FROM sales
GROUP BY userid;
您可以使用以下内容:
SELECT
t2.name,
t2.week AS from_week, t1.week AS to_week,
t2.sold_items AS from_sold, t1.sold_items AS to_sold,
((t1.sold_items - t2.sold_items) / t2.sold_items) * 100 AS growth
FROM table_name t1 LEFT JOIN (
SELECT name, sold_items, week FROM table_name
) t2 ON t1.name = t2.name AND t1.week = t2.week + 1
HAVING growth IS NOT NULL
ORDER BY name, t1.week
+---------+------+---------------------+----+
| userid | sold | datesold | wk |
+---------+------+---------------------+----+
| Tim | 10 | 2019-10-03 11:16:10 | 39 |
| Tim | 20 | 2019-10-10 11:16:10 | 40 |
| Bob | 5 | 2019-10-03 11:16:10 | 39 |
| Bob | 5 | 2019-10-04 11:16:10 | 39 |
| Bob | 25 | 2019-10-10 11:16:10 | 40 |
+---------+------+---------------------+----+
自MySQL 8.0以来,您还可以使用:
注意:您可以删除必须查看所有记录的选项,也可以不更改记录
要获得预期结果,您需要按名称分组,并按如下方式连接列:
select
concat(
name, ': ',
group_concat(sold_items order by week separator ' > '),
' (',
round(100 * (max(case when week = 2 then sold_items end) / max(case when week = 1 then sold_items end) - 1), 0),
'%)'
) result
from tablename
where week in (1, 2)
group by name
+--------+------+---------------------+
| userid | sold | datesold |
+--------+------+---------------------+
| Tim | 10 | 2019-10-03 11:16:10 |
| Tim | 20 | 2019-10-10 11:16:10 |
| Bob | 5 | 2019-10-03 11:16:10 |
| Bob | 5 | 2019-10-04 11:16:10 |
| Bob | 25 | 2019-10-10 11:16:10 |
+--------+- ----+---------------------+
看。
结果:
假设您的真实表格如下所示:
select
concat(
name, ': ',
group_concat(sold_items order by week separator ' > '),
' (',
round(100 * (max(case when week = 2 then sold_items end) / max(case when week = 1 then sold_items end) - 1), 0),
'%)'
) result
from tablename
where week in (1, 2)
group by name
+--------+------+---------------------+
| userid | sold | datesold |
+--------+------+---------------------+
| Tim | 10 | 2019-10-03 11:16:10 |
| Tim | 20 | 2019-10-10 11:16:10 |
| Bob | 5 | 2019-10-03 11:16:10 |
| Bob | 5 | 2019-10-04 11:16:10 |
| Bob | 25 | 2019-10-10 11:16:10 |
+--------+- ----+---------------------+
*注意,在本例中,我特意将Bob的数量从同一周分为两个连续日期
您可以通过使用获取周。因此,使用如下查询:
SELECT userid,sold,datesold,WEEK(datesold) as wk FROM sales;
您将得到如下结果:
SELECT
t2.name,
t2.week AS from_week, t1.week AS to_week,
t2.sold_items AS from_sold, t1.sold_items AS to_sold,
((t1.sold_items - t2.sold_items) / t2.sold_items) * 100 AS growth
FROM table_name t1 LEFT JOIN (
SELECT name, sold_items, week FROM table_name
) t2 ON t1.name = t2.name AND t1.week = t2.week + 1
HAVING growth IS NOT NULL
ORDER BY name, t1.week
+---------+------+---------------------+----+
| userid | sold | datesold | wk |
+---------+------+---------------------+----+
| Tim | 10 | 2019-10-03 11:16:10 | 39 |
| Tim | 20 | 2019-10-10 11:16:10 | 40 |
| Bob | 5 | 2019-10-03 11:16:10 | 39 |
| Bob | 5 | 2019-10-04 11:16:10 | 39 |
| Bob | 25 | 2019-10-10 11:16:10 | 40 |
+---------+------+---------------------+----+
我们将SUMSELD和GROUP BY userid,wk添加到上述查询中:
SELECT userid,SUM(sold) AS tqty,datesold,WEEK(datesold) AS wk
FROM sales
GROUP BY userid,wk;
然后结合Sebastian提供的查询:
SELECT t2.userid,
t2.wk AS from_week,
WEEK(t1.datesold) AS to_week,
t2.tqty AS from_sold,
t1.sold AS to_sold,
((t1.sold - t2.tqty) / t2.tqty) * 100 AS growth
FROM sales t1
LEFT JOIN (
SELECT userid, SUM(sold) AS tqty, WEEK(datesold) AS wk
FROM sales
GROUP BY userid, wk
) t2
ON t1.userid = t2.userid
AND WEEK(t1.datesold) = t2.wk + 1
HAVING growth IS NOT NULL
ORDER BY userid, WEEK(t1.datesold);
结果如下:
+--------+-----------+---------+-----------+---------+----------+
| userid | from_week | to_week | from_sold | to_sold | growth |
+--------+-----------+---------+-----------+---------+----------+
| Bob | 39 | 40 | 10 | 25 | 150.0000 |
| Tim | 39 | 40 | 10 | 20 | 100.0000 |
+--------+-----------+---------+-----------+---------+----------+
您是否只需要第1周和第2周的这些结果?欢迎使用。请,当你创建一个问题时,提出一个问题。。。你似乎在要求一个解决方案。请记住,SO不是免费的编码服务。始终尝试给出一个示例输入ok,您期望的输出ok,您尝试了什么,您的问题是什么。谢谢,就像那样,只是在我的情况下,我没有确切的周数,我只有时间戳,我想比较最近的两个。这就是我现在所拥有的,但给出了一个错误SELECT userid,SELECT sold order by SALL limit 0,1作为last,SELECT sold order by SALL limit 1,1作为sales group by userid的半last