2016-09-15 2 views
0

Я ударился тепло, пытаясь превратить эту таблицу:MySQL Сводная таблица дат по имени столбца

Date   Table  Size in MB 
------------ ----------- ----------- 
2016-09-14 table1  1.02 
2016-09-15 table1  6.03   
2016-09-14 table2  120.0  
2016-09-15 table2  150.0  
2016-09-14 table3  50.0   
2016-09-15 table3  52.0   

В это:

Table  2016-09-14 2016-09-15 DIFF 
----------- ----------- ----------- ------- 
table1  1.02   6.03   5.01 
table2  120.0  150.0   30.0 
table3  50.0   52.0   2.0 

Сводная таблица образуют исходную таблицу, но поставив date в имя столбца для размера в столбце mb и, если возможно, разницу между ними в последнем столбце.

До сих пор я мог бы сделать это

Table  Date1  Date2  
----------- ----------- ----------- 
table1  2016-09-14 2016-09-15 
table2  2016-09-14 2016-09-15 
table3  2016-09-14 2016-09-15 

с использованием коды из предыдущего поста о сводных таблицах

select `Table`, 
    max(case when rownum = 1 then date end) Date1, 
    max(case when rownum = 2 then date end) Date2 
from 
(
    select table_name AS `Table`, 
    date,round(((data_length + index_length)/1024/1024), 2) `Size in MB`, 
    @row:=if(@prev=table_name, @row,0) + 1 as rownum, 
    @prev:=table_name 
    FROM DBA_DB.table_growth_history, (SELECT @row:=0, @prev:=null) r 
    order by table_name, date 
) s 
group by table_name 
order by table_name, date 

Не то, что я хочу, но, может быть, шаг ближе. Мне нужна помощь экспертов. Я ценю любые советы. Благодаря

ответ

0

Вы можете просто сделать условную агрегацию:

select table_name, 
     max(case when date = '2016-09-14' then round(((data_length + index_length)/1024/1024), 2) end) as size_20160915, 
     max(case when date = '2016-09-15' then round(((data_length + index_length)/1024/1024), 2) end) as size_20160916, 
     (max(case when date = '2016-09-15' then round(((data_length + index_length)/1024/1024), 2) end) - 
     max(case when date = '2016-09-14' then round(((data_length + index_length)/1024/1024), 2) end) 
     ) as diff 
from DBA_DB.table_growth_history t 
where date in ('2016-09-14', '2016-09-15') 
group by table_name; 
+0

я должен идти с этим потом. На данный момент это единственное решение. Спасибо @gordon – Haohmaru