问题
I am trying to get the total of the unknown columns at runtime from a table.
Here's the source_table:
+----+------------+-----------+-----------+-----------+-----------+-----------+
| ID | Name | Unknown 1 | Unknown 2 | Unknown 3 | Unknown 4 | Unknown 5 |
+----+------------+-----------+-----------+-----------+-----------+-----------+
| 1 | abc | 10.00 | 18.00 | 5.00 | 21.00 | 6.00 |
+----+------------+-----------+-----------+-----------+-----------+-----------+
| 2 | ghq | 22.00 | 14.00 | 12.00 | 11.00 | 23.00 |
+----+------------+-----------+-----------+-----------+-----------+-----------+
| 3 | xyz | 35.00 | 8.00 | 16.00 | 7.00 | 4.00 |
+----+------------+-----------+-----------+-----------+-----------+-----------+
And here's the desired result_table I am trying to achieve:
+-----------+-----------+
| MyColumns | Total |
+-----------+-----------+
| Unknown 1 | 67.00 |
+-----------+-----------+
| Unknown 2 | 40.00 |
+-----------+-----------+
| Unknown 3 | 33.00 |
+-----------+-----------+
| Unknown 4 | 39.00 |
+-----------+-----------+
| Unknown 5 | 33.00 |
+-----------+-----------+
I already figured out the query for the unknown column (1st field) above. But, I am having difficulty how to get the total column (2nd field) with my attempt code below:
SELECT `COLUMN_NAME`
FROM `INFORMATION_SCHEMA`.`COLUMNS`
WHERE `TABLE_SCHEMA` = 'mydb'
AND `TABLE_NAME` = 'source_table'
AND `COLUMN_NAME` NOT LIKE 'ID'
AND `COLUMN_NAME` NOT LIKE 'Name';
I will appreciate any help here to get me the total column (2nd field) using my code above.
UPDATE 1: @Akina answer result_table — CORRECTED BY QUOTING HERE
''',COLUMN_NAME, '''.
+-----------+-----------+
| MyColumns | Total |
+-----------+-----------+
| 10.00 | 67.00 |
+-----------+-----------+
| 18.00 | 40.00 |
+-----------+-----------+
| 5.00 | 33.00 |
+-----------+-----------+
| 21.00 | 39.00 |
+-----------+-----------+
| 6.00 | 33.00 |
+-----------+-----------+
回答1:
SELECT GROUP_CONCAT( CONCAT( 'SELECT ''',
COLUMN_NAME,
''' Columns, SUM(`',
COLUMN_NAME,
'`) Total FROM mydb.source_table' )
SEPARATOR '\nUNION ALL\n' )
INTO @sql
FROM INFORMATION_SCHEMA.COLUMNS
WHERE TABLE_SCHEMA = 'mydb'
AND TABLE_NAME = 'source_table'
AND COLUMN_NAME NOT IN ('ID', 'Name');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DROP PREPARE stmt;
fiddle
For debugginig purposes - execute only SELECT query removing INTO clause firstly (also you may edit to SEPARATOR '\nUNION ALL\n' - the query text will be more clear for to view), check that built query text is correct synthactically, then execute it and check that its output is correct too. If not - edit.
Possible problem source - the column name may be a reserved word or may concain spaces or another problematic chars. In such case you must add quoting backticks to wrapping string literals in CONCAT.
PS. Code edited, all mentioned editions (and database name - for to make the code CurrentDB-independent) added into.
PPS. Database and table names (and even skipped names list) may be converted to parameters if needed, making the code more universal...
回答2:
Consider the following:
DROP TABLE IF EXISTS my_bad_table;
CREATE TABLE my_bad_table
(ID SERIAL PRIMARY KEY
,Name VARCHAR(12) NOT NULL UNIQUE
,Unknown1 DECIMAL(5,2) NOT NULL
,Unknown2 DECIMAL(5,2) NOT NULL
,Unknown3 DECIMAL(5,2) NOT NULL
,Unknown4 DECIMAL(5,2) NOT NULL
,Unknown5 DECIMAL(5,2) NOT NULL
);
INSERT INTO my_bad_table VALUES
(1,'abc',10.00,18.00, 5.00,21.00, 6.00),
(2,'ghq',22.00,14.00,12.00,11.00,23.00),
(3,'xyz',35.00, 8.00,16.00, 7.00, 4.00);
DROP TABLE IF EXISTS my_good_table;
CREATE TABLE my_good_table AS
SELECT id bad_table_id
, '1'+0 unknown
, unknown1 score
FROM my_bad_table
UNION
SELECT id
, '2'+0
, unknown2
FROM my_bad_table
UNION
SELECT id
, '3'+0
, unknown3
FROM my_bad_table
UNION
SELECT id
, '4'+0
, unknown4
FROM my_bad_table
UNION
SELECT id
, '5'+0
, unknown5
FROM my_bad_table;
ALTER TABLE my_good_table ADD PRIMARY KEY(bad_table_id,unknown);
ALTER TABLE my_good_table ADD INDEX(score);
ALTER TABLE my_bad_table DROP COLUMN unknown1;
ALTER TABLE my_bad_table DROP COLUMN unknown2;
ALTER TABLE my_bad_table DROP COLUMN unknown3;
ALTER TABLE my_bad_table DROP COLUMN unknown4;
ALTER TABLE my_bad_table DROP COLUMN unknown5;
Query:
SELECT unknown
, SUM(score) total
FROM my_good_table
GROUP
BY unknown
ORDER
BY unknown;
+---------+-------+
| unknown | total |
+---------+-------+
| 1 | 67.00 |
| 2 | 40.00 |
| 3 | 33.00 |
| 4 | 39.00 |
| 5 | 33.00 |
+---------+-------+
来源:https://stackoverflow.com/questions/63188788/mysql-get-total-query-from-unknown-columns-at-runtime