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;

私がしなければならないことは、次のように合計列を追加することです:

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

私がこれを正しく解釈していれば、これがあなたのやりたいことだと思います。あなたは実際に合計をしていませんよね?各行のすべてのフィールド値を追加しています。ここでの 2 番目の 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 に答える