MySQL Get Total Query from Unknown Columns at Runtime

我的未来我决定 提交于 2021-02-11 15:54:54

问题


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

标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!