解決した
とても簡単でしたが、平日は私の脳を壊しました。
次のように、必要なものを取得するには、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');
前もってありがとう、マイケル。