首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >SQL sum by group name with inner present

SQL sum by group name with inner present
EN

Stack Overflow用户
提问于 2013-09-21 12:10:13
回答 2查看 11.4K关注 0票数 2

我有以下SQL脚本:

代码语言:javascript
复制
  SELECT       
    vapp.NAME
  , memcpu.[MEM_SIZE_MB]/1000
  , memcpu.[NUM_VCPU]
  , sum(convert(bigint, hdd.CAPACITY))
  FROM [VCenterServer].[dbo].[VPX_VM] AS memcpu
  INNER JOIN [VCenterServer].[dbo].[VPX_GUEST_DISK] AS hdd
  ON memcpu.ID = hdd.VM_ID
  INNER JOIN [VCenterServer].[dbo].[VPXV_RESOURCE_POOL] AS vapp
  ON memcpu.RESOURCE_GROUP_ID = vapp.RESOURCEPOOLID
  GROUP BY 
  memcpu.[ID]
  , memcpu.[DNS_NAME] 
  , memcpu.[MEM_SIZE_MB]
  , memcpu.[NUM_VCPU]
  , hdd.PATH
  , hdd.CAPACITY
  , vapp.RESOURCEPOOLID
  , vapp.NAME;

它描述了这样的结果

代码语言:javascript
复制
NAME      MEM     NUM_VCPU  CAPACITY
Core       3            1   42947571712
Core       2            1   42947571712
Core       4            1   42947571712
Core       4            1   134214578176
Phones     2            2   26977628160
Phones     2            2   103442432
Phones     1            1   37378260992
Phones     1            1   103442432

我想要它做的是根据名称对内存、NUM_VCPU和容量求和,同时保留名称:

代码语言:javascript
复制
NAME      MEM     NUM_VCPU  CAPACITY
Core      13         4      263057293312
Phones    6          6      64562774016

更新:

根据答案,我调整了SQL代码,现在它的工作方式应该是:

代码语言:javascript
复制
select t1.NAME, t1.STORAGE, t2.CPU, t2.MEMORY
from 
(SELECT vapp.NAME [NAME]
     ,SUM(ceiling(convert(decimal(21, 0), hdd.CAPACITY)/(1024*1024*1024))) AS STORAGE
     FROM [VCenterServer].[dbo].[VPX_VM] AS memcpu
     INNER JOIN [VCenterServer].[dbo].[VPX_GUEST_DISK] AS hdd
     ON memcpu.ID = hdd.VM_ID
     INNER JOIN [VCenterServer].[dbo].[VPXV_RESOURCE_POOL] AS vapp
     ON memcpu.RESOURCE_GROUP_ID = vapp.RESOURCEPOOLID
     GROUP BY vapp.NAME  
) t1
left join
(SELECT vapp.NAME [NAME]
     ,SUM(memcpu.[MEM_SIZE_MB]/1024) AS [MEMORY]
     ,SUM(memcpu.[NUM_VCPU]) AS [CPU]
     FROM [VCenterServer].[dbo].[VPX_VM] AS memcpu
     INNER JOIN [VCenterServer].[dbo].[VPXV_RESOURCE_POOL] AS vapp
     ON memcpu.RESOURCE_GROUP_ID = vapp.RESOURCEPOOLID
     GROUP BY vapp.NAME  
) t2
on
t1.NAME = t2.NAME
ORDER BY t1.NAME
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-09-22 05:27:40

只需从GROUP BY子句中删除不必要的列

代码语言:javascript
复制
  SELECT vapp.NAME
         ,SUM(memcpu.[MEM_SIZE_MB]/1000) AS [MEM_SIZE_MB]
         ,SUM(memcpu.[NUM_VCPU]) AS [NUM_VCPU]
         ,SUM(convert(bigint, hdd.CAPACITY)) AS CAPACITY
  FROM [VCenterServer].[dbo].[VPX_VM] AS memcpu
    INNER JOIN [VCenterServer].[dbo].[VPX_GUEST_DISK] AS hdd
      ON memcpu.ID = hdd.VM_ID
    INNER JOIN [VCenterServer].[dbo].[VPXV_RESOURCE_POOL] AS vapp
      ON memcpu.RESOURCE_GROUP_ID = vapp.RESOURCEPOOLID
  GROUP BY vapp.NAME;
票数 1
EN

Stack Overflow用户

发布于 2013-09-21 12:13:03

请尝试:

代码语言:javascript
复制
SELECT
    Name,
    SUM(MEM) MEM,
    SUM(NUM_VCPU) NUM_VCPU,
    SUM(CAPACITY) CAPACITY
FROM(
    SELECT       
        vapp.NAME, 
        memcpu.[MEM_SIZE_MB]/1000 MEM, 
        memcpu.[NUM_VCPU] NUM_VCPU, 
        SUM(CONVERT(BIGINT, hdd.CAPACITY)) OVER(PARTITION BY
            memcpu.[ID], 
            memcpu.[DNS_NAME],
            memcpu.[MEM_SIZE_MB], 
            memcpu.[NUM_VCPU], 
            hdd.PATH, 
            hdd.CAPACITY, 
            vapp.RESOURCEPOOLID, 
            vapp.NAME) CAPACITY 

      FROM [VCenterServer].[dbo].[VPX_VM] AS memcpu
          INNER JOIN [VCenterServer].[dbo].[VPX_GUEST_DISK] AS hdd
          ON memcpu.ID = hdd.VM_ID
          INNER JOIN [VCenterServer].[dbo].[VPXV_RESOURCE_POOL] AS vapp
          ON memcpu.RESOURCE_GROUP_ID = vapp.RESOURCEPOOLID
    )x
    GROUP BY NAME
票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18928780

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档