2016-08-11 2 views
0

У меня есть таблица, как показано ниже. Я хочу, чтобы запрашивать данные и показать строки как колонкиSQL: сводный способ запроса данных

Customer MetricName MetricValue Date 
A   Upload 2   10-AUG-2007 
A   Download 2   10-AUG-2007 
A   Storage 100  10-AUG-2007 
A   Storage 110  11-AUG-2007 
B   Storage 200  11-AUG-2007 
A   Upload 2   12-AUG-2007 
A   Download 2   12-AUG-2007 
B   Upload 2   10-AUG-2007 
B   Download 2   10-AUG-2007 

Usage Последняя неделя

Скачать - сумма всех загрузок в неделю хранения - наивысшая ценность в неделю

Customer Download Upload Storage 
    A   4  4  110 
    B   2  2  200 

Как достичь этого с помощью Pivot или другого метода

+2

Что вы пробовали? Вы можете использовать общее табличное выражение (или вложенный выбор) для фильтрации строк, которые хотите использовать ane, а затем использовать PIVOT – Matt

+0

. Это только те 3 варианта - 'Download',' Upload' или 'Storage'? - Если это так, вам лучше просто написать SQL напрямую. –

+0

Если я использую pivot, как я сделаю 2 предложения - MAX и SUM на том же столбце ...? – user3359574

ответ

0

Что-то вроде этого ... PIVOT требует, чтобы такая же совокупная функция была применена ко всем ВМН; старый «ручной» способ поворота, используя выражения case, более гибкий (как показано ниже). Я не был уверен, что вы подразумеваете под «неделей» - я просто положил это в статью WHERE. Кроме того, не используйте зарезервированные слова, такие как DATE для имен столбцов (или таблиц), вы не можете сделать это напрямую, и вы не должны делать это единственным возможным способом (используя двойные кавычки) - это очень плохая практика. Я изменил название колонки Date на dt.

with 
    input_data (customer, metricname, metricvalue, dt) AS (
     select 'A', 'Upload' , 2 , to_date('10-AUG-2007', 'dd-MON-yyyy') from dual union all 
     select 'A', 'Download', 2 , to_date('10-AUG-2007', 'dd-MON-yyyy') from dual union all 
     select 'A', 'Storage' , 100 , to_date('10-AUG-2007', 'dd-MON-yyyy') from dual union all 
     select 'A', 'Storage' , 110 , to_date('11-AUG-2007', 'dd-MON-yyyy') from dual union all 
     select 'B', 'Storage' , 200 , to_date('11-AUG-2007', 'dd-MON-yyyy') from dual union all 
     select 'A', 'Upload' , 2 , to_date('12-AUG-2007', 'dd-MON-yyyy') from dual union all 
     select 'A', 'Download', 2 , to_date('12-AUG-2007', 'dd-MON-yyyy') from dual union all 
     select 'B', 'Upload' , 2 , to_date('10-AUG-2007', 'dd-MON-yyyy') from dual union all 
     select 'B', 'Download', 2 , to_date('10-AUG-2007', 'dd-MON-yyyy') from dual 
    ) 
select customer, 
     sum(case when metricname = 'Upload' then metricvalue end) as upload, 
     sum(case when metricname = 'Download' then metricvalue end) as download, 
     max(case when metricname = 'Storage' then metricvalue end) as storage 
from  input_data 
where dt between to_date('09-AUG-2007', 'dd-MON-yyyy') and 
               to_date('15-AUG-2007', 'dd-MON-yyyy') 
group by customer 
order by customer 
; 

CUSTOMER  UPLOAD DOWNLOAD STORAGE 
-------- ---------- ---------- ---------- 
A     4   4  110 
B     2   2  200 
+0

Это то, что я искал. Спасибо друг!!! – user3359574

Смежные вопросы