2014-09-01 4 views
0

У меня есть запрос я должен суммировать все ВМ по CUSTOMER_NAME, tier_name, vm_name Таким образом, каждому vm_will выходного обобщённом списка ярусов хранения использует их использованияOracle GroupBy и OrderBy вопрос

so if vm1 is using tier1 and tier2 belonging to Customer1 entries are like so, 

tier1.entry=100 
tier1.entry2=100 

tier2.entry1 = 50 
tier2.entery1 = 40 

таким образом каждые возвращенные Общая сумма вывода будет выглядеть примерно так:

customer1 VM1 Уровень1 Всего = 200 customer1 VM1 Уровень2 Всего = 90

, но это дает мне эту ошибку:

SQL> select customer_name, 
    2 tier_name, 
    3 substr(decode(vcd_managed,'Y',vm_name,'N',vm_group_name || '/' || vm_display_name),1,100) vm_name, 
sum(provisioned_gb) Provisioned_GB, 
sum(consumed_gb) Consumed_GB 
from customers a, 
vm_groups b, 
vms c, 
vm_storage_histories d, 
datastores e, 
storage_tiers f 
    4 5 6 7 8 9 10 11 12 where a.customer_id = b.customer_id 
13 and b.vm_group_id = c.vm_group_id 
14 and c.vm_id = d.vm_id 
15 and d.datastore_id = e.datastore_id 
16 and e.storage_tier_id = f.storage_tier_id 
17 and trunc(d.datetime) = to_date('01-Aug-2014', 'DD-MON-YYYY') 
18 and a.customer_id != 24 -- enki 
19 and a.customer_id != 1 -- unassigned 
20 group by customer_name,tier_name, vm_name 
21 order by 1,2,3 
22 
SQL>/
substr(decode(vcd_managed,'Y',vm_name,'N',vm_group_name || '/' || vm_display_name),1,100) vm_name, 
       * 
ERROR at line 3: 
ORA-00979: not a GROUP BY expression 

Вот мой запрос:

select customer_name, 
tier_name, 
substr(decode(vcd_managed,'Y',vm_name,'N',vm_group_name || '/' || vm_display_name),1,100) vm_name, 
sum(provisioned_gb) Provisioned_GB, 
sum(consumed_gb) Consumed_GB 
from customers a, 
vm_groups b, 
vms c, 
vm_storage_histories d, 
datastores e, 
storage_tiers f 
where a.customer_id = b.customer_id 
and b.vm_group_id = c.vm_group_id 
and c.vm_id = d.vm_id 
and d.datastore_id = e.datastore_id 
and e.storage_tier_id = f.storage_tier_id 
and trunc(d.datetime) = to_date('01-Aug-2014', 'DD-MON-YYYY') 
and a.customer_id != 24 -- enki 
and a.customer_id != 1 -- unassigned 
group by customer_name,tier_name, vm_name 
order by 1,2,3 

/

ответ

3

При создании совокупного запроса (с использованием GROUP BY), каждый пункт в ЗЕЬЕСТ должен либо быть что-то в вашей GROUP BY оператора или агрегатной функции (SUM , MAX, AVG и т. Д.).

В вашем примере "substr (decode (vcd_managed, 'Y', vm_name, 'N', vm_group_name || '/' || vm_display_name), 1,100)" не указан в инструкции GROUP BY, поэтому вы получить сообщение об ошибке. Легко фиксируется - добавьте этот код точно так, как он написан в SELECT для GROUP BY, и он должен работать.

group by customer_name,tier_name, vm_name, 
     substr(decode(vcd_managed,'Y',vm_name,'N',vm_group_name || '/' || vm_display_name),1,100) 
0
with statement as (select customer_name as customer, 
tier_name as tier, 
substr(decode(vcd_managed,'Y',vm_name,'N',vm_group_name || '/' || vm_display_name),1,100) as vm_name, 
provisioned_gb as Provisioned_GB, 
consumed_gb as Consumed_GB 
from customers a, 
vm_groups b, 
vms c, 
vm_storage_histories d, 
datastores e, 
storage_tiers f 
where a.customer_id = b.customer_id 
and b.vm_group_id = c.vm_group_id 
and c.vm_id = d.vm_id 
and d.datastore_id = e.datastore_id 
and e.storage_tier_id = f.storage_tier_id 
and trunc(d.datetime) = to_date('01-Aug-2014', 'DD-MON-YYYY') 
and a.customer_id != 24 -- enki 
and a.customer_id != 1 -- unassigned 
) 

select customer,tier,vm_name,sum(Provisioned_GB),sum(Consumed_GB) 
from statement 
group by customer,tier,vm_name 
order by order by 1,2,3