Как повторно использовать набор результатов в запросе 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
Другие вопросы по тегам