Трябва да използвате условно сумиране и динамичен SQL за това
SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'SUM(CASE WHEN l.Item = ',
id,
' THEN l.qty END) `',
name, '`'
)
) INTO @sql
FROM ItemLIst;
SET @sql = CONCAT('SELECT u.name, ', @sql, '
FROM OrderList l JOIN UserList u
ON l.User = u.id
GROUP BY u.name');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
Изход:
<пред>| ИМЕ | ЯБЪЛКА | ОРАНЖЕВО | БАНАН | КИВИ | МАНГО |------------------------------------------------ ------| Джеймс | (нула) | (нула) | (нула) | (нула) | 1 || Джон | (нула) | 2 | 3 | 1 | (нула) || Мери | 4 | 2 | (нула) | (нула) | (нула) |Ето SQLPiddle демонстрация
Сега няма да можете да го увиете в изглед, но можете да го направите съхранена процедура.
DELIMITER $$
CREATE PROCEDURE sp_order_report()
BEGIN
SET @sql = NULL;
SELECT
GROUP_CONCAT(DISTINCT
CONCAT(
'SUM(CASE WHEN l.Item = ',
id,
' THEN l.qty END) `',
name, '`'
)
) INTO @sql
FROM
ItemLIst;
SET @sql = CONCAT('SELECT u.name, ', @sql, '
FROM OrderList l JOIN UserList u
ON l.User = u.id
GROUP BY u.name');
PREPARE stmt FROM @sql;
EXECUTE stmt;
DEALLOCATE PREPARE stmt;
END$$
DELIMITER ;
И го използвайте по следния начин:
CALL sp_order_report();
Ето SQLPiddle демонстрация