2016-08-11 47 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 

用法上周

下载 - 在一个星期 存储所有下载的总和 - 最高值在本周

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

如何使用Pivot或其他方法实现此目的

+2

你试过了什么?您可以使用公共表格表达式(或嵌套选择)过滤您想要的数据行,然后使用PIVOT – Matt

+0

这仅仅是3个选项 - “下载”,“上传”还是“存储”? - 如果是这样,你最好直接写SQL。 –

+0

如果我使用pivot,我将如何做2个子句 - MAX和SUM在同一列...? – user3359574

回答

0

这样的事情...... PIVOT需要相同的聚合函数才能全部应用于col UMNS;旧的“手动”旋转方式(使用大小写表达式)更加灵活(如下所示)。我不确定你的意思是“周” - 我只是把它放在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