Я пытаюсь получить из таблицы общее количество неизвестных столбцов во время выполнения.

Вот таблица_источников:

+----+------------+-----------+-----------+-----------+-----------+-----------+
| 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 |
+----+------------+-----------+-----------+-----------+-----------+-----------+

И вот желаемая таблица result_table, которую я пытаюсь достичь:

+-----------+-----------+
| MyColumns |   Total   |
+-----------+-----------+
| Unknown 1 |     67.00 |
+-----------+-----------+
| Unknown 2 |     40.00 |
+-----------+-----------+
| Unknown 3 |     33.00 |
+-----------+-----------+
| Unknown 4 |     39.00 |
+-----------+-----------+
| Unknown 5 |     33.00 |
+-----------+-----------+

Я уже разобрался с запросом неизвестного столбца (1-е поле) выше. Но мне трудно получить общий столбец (2-е поле) с моим кодом попытки ниже:

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';

Я буду признателен за любую помощь здесь, чтобы получить общий столбец (2-е поле), используя приведенный выше код.

ОБНОВЛЕНИЕ 1: @Akina answer result_table - ИСПРАВЛЕНО ЦИТИРОВКОЙ ЗДЕСЬ ''',COLUMN_NAME, ''' .

+-----------+-----------+
| MyColumns |   Total   |
+-----------+-----------+
|     10.00 |     67.00 |
+-----------+-----------+
|     18.00 |     40.00 |
+-----------+-----------+
|      5.00 |     33.00 |
+-----------+-----------+
|     21.00 |     39.00 |
+-----------+-----------+
|      6.00 |     33.00 |
+-----------+-----------+
0
RickyBelmont 31 Июл 2020 в 11:59

2 ответа

Лучший ответ
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;

скрипка

Для целей отладки - сначала выполните только запрос SELECT, удалив предложение INTO (также вы можете отредактировать до SEPARATOR '\nUNION ALL\n' - текст запроса будет более понятным для просмотра), убедитесь, что построенный текст запроса синтаксически верен, затем выполните его и проверьте что его вывод тоже правильный. Если нет - редактируйте.

Возможный источник проблемы - имя столбца может быть зарезервированным словом или может содержать пробелы или другие проблемные символы. В таком случае вы должны добавить кавычки для обертывания строковых литералов в CONCAT.


PS . Код отредактирован, все упомянутые редакции (и название базы данных - чтобы сделать код CurrentDB независимым) добавлены в.

PPS . Имена баз данных и таблиц (и даже список пропущенных имен) при необходимости могут быть преобразованы в параметры, что сделает код более универсальным ...

2
Akina 31 Июл 2020 в 12:29

Обратите внимание на следующее:

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;

Запрос:

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 |
+---------+-------+
1
Strawberry 31 Июл 2020 в 09:20