Как повторно использовать набор результатов в запросе MySQL
У меня есть набор результатов, как это после выполнения "select * from temp"
id | Month | value1 | value2 |
------------------------------
1 | Apr | 100 | 150
2 | May | 50 | 75
3 | Jan | 50 | 75
5 | Feb | 50 | 75
6 | mar | 50 | 75
Я хочу изменить его столбец на строки, как сводная таблица.
Я использовал случай, когда заявление, чтобы изменить его.
select
'value1' as Field,
SUM(CASE
WHEN dc.month = 'January' THEN dc.value1
ELSE ''
END) AS January,
SUM(CASE
WHEN dc.month = 'February' THEN dc.value1
ELSE ''
END) AS February,
SUM(CASE
WHEN dc.month = 'March' THEN dc.value1
ELSE ''
END) AS March
SUM(CASE
WHEN dc.month = 'April' THEN dc.value1
ELSE ''
END) AS April,
SUM(CASE
WHEN dc.month = 'May' THEN dc.value1
ELSE ''
END) AS May
from
(select
* from
temp)dc
Field | Jan | Feb | Mar | Apr | May
-------------------------------------
Value1 | 50 | 50 | 50 | 100 | 50
Я хочу получить тот же набор результатов для value2 в том же запросе без использования UNION. Потому что временная таблица имеет много данных.
Field | Jan | Feb | Mar | Apr | May
-------------------------------------
Value1 | 50 | 50 | 50 | 100 | 50
Value1 | 75 | 75 | 75 | 150 | 75
2 ответа
Решение
Это решение использует объединение, но только для создания "поддельных" строк для представления каждого столбца значения *, а затем объединения и группировки по этим строкам:
SELECT
`field`,
SUM(CASE
WHEN dc.month = 'Jan' THEN
CASE `field`
WHEN 'value1' THEN dc.value1
WHEN 'value2' THEN dc.value2
END
ELSE ''
END) AS January,
SUM(CASE
WHEN dc.month = 'Feb' THEN
CASE `field`
WHEN 'value1' THEN dc.value1
WHEN 'value2' THEN dc.value2
END
ELSE ''
END) AS February,
SUM(CASE
WHEN dc.month = 'Mar' THEN
CASE `field`
WHEN 'value1' THEN dc.value1
WHEN 'value2' THEN dc.value2
END
ELSE ''
END) AS March,
SUM(CASE
WHEN dc.month = 'Apr' THEN
CASE `field`
WHEN 'value1' THEN dc.value1
WHEN 'value2' THEN dc.value2
END
ELSE ''
END) AS April,
SUM(CASE
WHEN dc.month = 'May' THEN
CASE `field`
WHEN 'value1' THEN dc.value1
WHEN 'value2' THEN dc.value2
END
ELSE ''
END) AS May
FROM
(SELECT
* FROM temp
)dc
INNER JOIN (
SELECT 'value1' AS `field`
UNION SELECT 'value2'
) AS value_columns
GROUP BY `field`
Если его всего 2 столбца, т.е. value1
а также value2
тогда вы можете использовать UNION как DEMO
select
'value1' as Field,
SUM(
CASE
WHEN dc.month = 'Jan' THEN dc.value1
ELSE ''
END) AS January,
SUM(
CASE
WHEN dc.month = 'Feb' THEN dc.value1
ELSE ''
END) AS February,
SUM(
CASE
WHEN dc.month = 'Mar' THEN dc.value1
ELSE ''
END) AS March,
SUM(
CASE
WHEN dc.month = 'Apr' THEN dc.value1
ELSE ''
END) AS April,
SUM(
CASE
WHEN dc.month = 'May' THEN dc.value1
ELSE ''
END)AS May
from
temp dc
UNION
select
'value2' as Field,
SUM(
CASE
WHEN dc.month = 'Jan' THEN dc.value2
ELSE ''
END) AS January,
SUM(
CASE
WHEN dc.month = 'Feb' THEN dc.value2
ELSE ''
END) AS February,
SUM(
CASE
WHEN dc.month = 'Mar' THEN dc.value2
ELSE ''
END) AS March,
SUM(
CASE
WHEN dc.month = 'Apr' THEN dc.value2
ELSE ''
END) AS April,
SUM(
CASE
WHEN dc.month = 'May' THEN dc.value2
ELSE ''
END)AS May
from temp dc