【问题标题】:Mysql Running Total off one tableMysql Running Total off 一张表
【发布时间】:2018-01-03 06:43:31
【问题描述】:

我查看了这个问题的几个不同答案,但似乎无法让查询正常工作。

这是我的表,其中包含列 user、weekNo、salesTotalYTD。

我目前正在将它们取出并按周分组,如下所示:

+------+--------+---------------+
| user | weekNo | salesTotalYTD |
+------+--------+---------------+
|Jared |   1    |      200      |
+------+--------+---------------+
|  Jim |   1    |      50       |
+------+--------+---------------+
|Jared |   2    |      30       |
+------+--------+---------------+
| Jim  |   2    |      100      |
+------+--------+---------------+

我正在尝试做但无法完成的事情如下:

+------+--------+---------------+
| user | weekNo | salesTotalYTD |
+------+--------+---------------+
|Jared |   1    |      200      |
+------+--------+---------------+
| Jim  |   1    |      50       |
+------+--------+---------------+
|Jared |   2    |      230      |
+------+--------+---------------+
| Jim  |   2    |      150      |
+------+--------+---------------+

这是我为第一次传递而工作的查询,但之后的每一次传递都是错误的:

SET @runtot:=0

SELECT
    salesTotalYTD,
    user,
    (@runtot := @runtot + salesTotalYTD) AS rt
  FROM weeksAndSalesmantbl
  GROUP BY user, weekNo
  ORDER BY (CASE WHEN weekNo = 52 THEN 0 ELSE 1 END) ASC, weekNo, user ASC

更新

由 Tim 提供的更新代码但返回错误:

$assignments = "
    SELECT
    t1.user,
    t1.weekNo,
    (SELECT SUM(t2.salesTotalYTD) FROM weeksAndSalesmantbl t2
    WHERE t2.user = t1.user AND t2.weekNo <= t1.weekNo) AS salesTotalYTD
    FROM weeksAndSalesmantbl t1
    ORDER BY
    t1.weekNo,
    t1.user";

  $salesTotalSalesManCumulative = [];

  $assignmentsqry = mysqli_query($db,$assignments);

  if (!$assignmentsqry) {
     printf("Error: %s\n", mysqli_error($db));
     exit();
  }

  while ($row = mysqli_fetch_array($assignmentsqry)) {

    $float = floatval($row['salesTotalYTD']);
    $float = round($float,2);

    array_push($salesTotalSalesManCumulative,$float);

  }

【问题讨论】:

  • 你真的有SELECT这样出现两次吗?
  • 不,这是一份遗漏,我已更正。
  • 我赞成你的问题。我们需要一个 PHP 人员来查看并提出意见。我认为您使用会话变量的原始方法也很好。
  • 看看here。我认为查询失败,不知道为什么。
  • Read here。 PHP 不喜欢我们在子查询中引用同一个表,因为它也出现在外部查询中。我对此感到惊讶,因为如果从大多数其他语言调用此查询肯定会运行。

标签: php mysql cumulative-sum


【解决方案1】:

您可以使用标准运行总计查询来解决此问题。但是,在这种情况下,我们还将总和限制为特定用户。

SELECT
    t1.user,
    t1.weekNo,
    (SELECT SUM(t2.salesTotalYTD) FROM weeksAndSalesmantbl t2
     WHERE t2.user = t1.user AND t2.weekNo <= t1.weekNo) AS salesTotalYTD
FROM weeksAndSalesmantbl t1
ORDER BY
    t1.weekNo,
    t1.user

输出:

演示在这里:

Rextester

更新:

由于您在游戏后期告诉我们weeksAndSalesmantbl 是一个临时表,而 MySQL 不喜欢我上面给出的查询,我们可以考虑使用会话变量对您的表进行单次传递。

SET @rt = NULL;
SET @user = NULL;

SELECT
    t.user,
    t.weekNo,
    t.rt AS salesTotalYTD
FROM
(
    SELECT
        @rt:=CASE WHEN @user=user THEN @rt+salesTotalYTD ELSE salesTotalYTD END AS rt,
        @user:=user AS user,
        weekNo
    FROM weeksAndSalesmantbl
    ORDER BY
        user,
        weekNo
) t
ORDER BY
    t.weekNo,
    t.user;

Demo

如果这仍然给您错误,那么您可能需要考虑摆脱该临时表。无论如何,您可能不想在生产中使用临时表。

【讨论】:

  • 我收到以下错误:Warning: mysqli_fetch_array() expects parameter 1 to be mysqli_result
  • @CraigHowell 我的查询有效,q.v。演示。如果您还有其他问题,可能是您在 PHP 代码中做错了。
  • 我将使用 PHP 发布我的完整代码。在与您的代码交换之前,它运行正常。
  • 第二种方法已经修复了错误,但是我没有返回每周的累积值,而是得到了一个意想不到的结果。我将尝试一些事情并回复你。谢谢@TimBiegeleisen
  • 由于某种原因,我得到的行/结果是我应该得到的两倍。我可以通过您的链接看到 MYSQL 正在按预期工作,但由于某种原因,它在我的代码中没有正确返回。这很奇怪,我不知道为什么会这样。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-23
  • 2012-07-07
  • 2013-03-05
  • 2014-01-31
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多