0

解决了

我很抱歉,伙计们,这很容易,但是工作日把我的脑子弄坏了。

我只需要根据 id 计算总和就可以得到我需要的东西,就像这样:

SET @sql = CONCAT('SELECT tt.Id, SUM(tt.Values) AS TOTAL, ' @sql, ' FROM db.Table tt GROUP BY tt.Id');

谢谢你的帮助!

非常感谢您的帮助:)

我有一个生成的表如下:

id      | key1    |   key2   | ... | keyN 

id_val1 | k1_val1 | k2_val1  | ... | kN_val1

...     | ...     |  ...     | ... | ...
id_valM | k1_valM |  k2_valM | ... | kN_valM

它是用代码生成的:

SET @sql = NULL;

SELECT
  GROUP_CONCAT(DISTINCT
    CONCAT(
      'MAX(IF(tt.Keys = ''',
      tt.Keys,
      ''', tt.Values, NULL)) AS ',
      tt.Keys
    )
  ) INTO @sql
FROM db.Table tt;

SET @sql = CONCAT('SELECT tt.Id, ', @sql, ' FROM db.Table tt GROUP BY tt.Id WITH ROLLUP');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;

我要做的是添加 Total 列,如下所示:

id      | key1    |   key2   | ... | keyN    | Total

id_val1 | k1_val1 | k2_val1  | ... | kN_val1 | sum(k1_val1, k2_val1,...,kN_val1)

...     | ...     |  ...     | ... | ...     | ...
id_valM | k1_valM |  k2_valM | ... | kN_valM | sum(k1_valM, k2_valM,...,kN_valM)

“WITH ROLLUP”不起作用,它只添加了另一行,列中有最大值,而我需要行中的总和。

问题是列数及其名称可能随时间而不同。正确使用他们的名字本身就是问题:)。

例如,我得到了列的名称,但是如何使用它们,因为它们不属于任何表?我可以将动态构建的 sql 转换为以下外观。但是你能告诉我@xxx 应该是什么样子吗:

SET @sql = CONCAT('SELECT tt.Id, SUM(', @xxx,') AS TOTAL, ' @sql, ' FROM db.Table tt GROUP BY tt.Id WITH ROLLUP');

在此先感谢,迈克尔。

4

1 回答 1

0

如果我正确地解释了这一点,我认为这就是你想要做的。你实际上并没有做一个总和,对吗?您正在为每一行添加所有字段值。这里的第二个 GROUP_CONCAT 应该创建在它们之间带有加号 (+) 的字段列表。试一试。

SET @sql = NULL;
SET @sql2 = NULL;

SELECT  GROUP_CONCAT(DISTINCT
                        CONCAT(
                                  'MAX(IF(tt.Keys = ''',
                                  tt.Keys,
                                  ''', tt.Values, NULL)) AS ',
                                  tt.Keys
                              )
                    ) INTO @sql,
        GROUP_CONCAT(DISTINCT
                        CONCAT(
                                  'MAX(IF(tt.Keys = ''',
                                  tt.Keys,
                                  ''', tt.Values, NULL))'
                              )
                     SEPARATOR '+'
                    ) INTO @sql2
FROM db.Table tt;

SET @sql = CONCAT('SELECT tt.Id, ', @sql, ', ', @sql2,' AS Total FROM db.Table tt GROUP BY tt.Id');

PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
于 2013-09-19T17:36:17.067 回答