Сложный поворот для запроса mysql с учетом того, что в будущем произойдет изменение данных с использованием Mysql в качестве БД - PullRequest
0 голосов
/ 28 мая 2020

Пожалуйста, рассмотрите следующий сценарий, ниже представлены операторы DDL и DML.

Я хочу видеть вывод, например:

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

Использование Mysql в качестве базы данных, поскольку у него есть функция PIVOT, потрачено так много времени, но потрачено впустую, дайте мне знать, возможно ли это, CatName довольно динамично c по своей природе это не постоянные значения, использование операторов case, приравненных к текущим значениям в таблицах, будет просто ограничивать и действительно служить, если в этом столбце в будущем будет больше других значений, например 'descp4' .

Я попытался сгенерировать sql с помощью предложения 'into' для хранения операторов, сгенерированных с помощью функции GROUP_CONCAT, но это не служит цели, я ценю любые предложения.

CREATE TABLE `to_pivot` (
  `Id` int unsigned NOT NULL AUTO_INCREMENT,
  `ID2` int unsigned NOT NULL,
  `CatName` varchar(255) NOT NULL,
  `CatID` varchar(255) DEFAULT NULL,
  `Value` varchar(255) DEFAULT NULL,
  PRIMARY KEY (`Id`)
) ENGINE=MyISAM ; 

INSERT INTO `to_pivot`
VALUES
(30,
2525,
'Descp1',
NULL,
123),
(29,
2525,
'Descp2',
NULL,
'ABz123'),
(27,
2525,
'Descp3',
NULL,
'SR'),(
25,
2515,
'Descp1',
NULL,
1
),
(32,
2515,
'Descp2',
NULL,
'12DL3');

1 Ответ

0 голосов
/ 28 мая 2020

Это немного сложно, и вам всегда нужно проверять c @ sql, чтобы увидеть, подходит ли ваш запрос.

Но это управляемо

SET @sql = NULL;
SELECT
    GROUP_CONCAT(DISTINCT
        CONCAT(
          'MAX(IF(CatName = "',
          CatName,
          '", `Value`, NULL)) AS "',
          CatName,'"'
        )
  ) INTO @sql
FROM
  (SELECT DISTINCT CatName
    FROM to_pivot) t1;
SET @sql = CONCAT('SELECT id2,', @sql, ' FROM to_pivot GROUP BY id2');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
✓

✓

✓

✓

 id2 | Descp1 | Descp2 | Descp3
---: | :----- | :----- | :-----
2525 | 123    | ABz123 | SR    
2515 | 1      | 12DL3  | <em>null</em>  

✓

db <> fiddle здесь

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...