【问题标题】:Oracle GroupBy and Orderby issueOracle Group By 和 Order By 问题
【发布时间】:2014-09-01 18:05:19
【问题描述】:

我有一个查询,我需要通过 customer_name、tier_name、vm_name 来汇总每个 vm 因此每个 vm_将输出一个它使用的存储层的汇总列表以及它们的用法

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 Tier1 总计 = 200 CUSTOMER1 VM1 Tier2 总计 = 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

/

【问题讨论】:

    标签: sql oracle database-administration


    【解决方案1】:

    当您创建聚合查询(使用 GROUP BY)时,SELECT 语句中的每个项目都必须是 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)
    

    【讨论】:

      【解决方案2】:
      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
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2017-02-11
        • 2011-06-28
        • 2017-02-06
        • 1970-01-01
        • 1970-01-01
        • 2022-01-16
        相关资源
        最近更新 更多