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