У меня есть эта таблица данных о продукте:
+--------+--------+------------+
| item_id| amount | date |
+--------+--------+------------+
| 4 | 100 | 01-04-2020 |
| 6 | 200 | 01-04-2020 |
| 9 | 300 | 01-04-2020 |
| 4 | 400 | 01-04-2020 |
| 4 | 300 | 02-04-2020 |
| 6 | 150 | 02-04-2020 |
| 6 | 150 | 02-04-2020 |
| 9 | 700 | 02-04-2020 |
+--------+--------+------------+
Я хочу сделать запрос, который поворачивает эту таблицу, чтобы ItemId
находился на стороне столбца, который отображает сумму всех items:
+------------+-----+-----+-----+
| date | 4 | 6 | 9 |
+------------+-----+-----+-----+
| 01-04-2020 | 400 | 200 | 400 |
| 02-04-2020 | 300 | 300 | 700 |
+------------+-----+-----+-----+
Мне удалось написать запрос, который мог бы это сделать:
SELECT
date,
SUM(IF(item_id = '1', item_record.amount, NULL)) AS 1,
SUM(IF(item_id = '2', item_record.amount, NULL)) AS 2,
SUM(IF(item_id = '3', item_record.amount, NULL)) AS 3,
COUNT(*) AS Total
FROM item_record
GROUP BY date WITH ROLLUP
Но запрос был жестко запрограммирован так, чтобы отображались только столбцы с item_id
1, 2, и 3. Мне нужно сделать его динамическим c.
Обыскивая StackOverflow, я обнаружил этот вопрос . После принятого ответа я попытался превратить его в подготовленный оператор
SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'SUM(IF(item_record.item_id = "',item_record.item_id,'", item_record.amount, NULL))
AS ',item_record.item_id
)
) INTO @sql
FROM item_record;
SET @sql =
CONCAT('SELECT date,
',@sql,',
COUNT(*) AS Total
FROM item_record
GROUP BY date WITH ROLLUP
');
PREPARE stmt FROM @sql;
EXECUTE stmt;
Но я обнаружил ошибку:
SQL Ошибка [1064] [42000]: у вас есть ошибка в синтаксисе SQL; проверьте руководство, соответствующее вашей версии сервера MySQL, чтобы найти правильный синтаксис для использования рядом с
'4,SUM(IF(item_record.item_id = "6", item_record.amount, NULL)) AS 6' at line 2
Где я сделал не так? Это похоже на простую синтаксическую ошибку, но я занимался этим несколько часов и до сих пор не знал, в чем дело.