【问题标题】:SQL sum by group name with inner join present存在内部连接的按组名进行 SQL 求和
【发布时间】:2013-09-26 13:13:06
【问题描述】:

我有以下 SQL 脚本:

  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;

它产生了这个结果

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

我想做的是根据名称对 MEM NUM_VCPU 和 CAPACITY 求和,但同时保留名称:

NAME      MEM     NUM_VCPU  CAPACITY
Core      13         4      263057293312
Phones    6          6      64562774016

更新:

根据我调整了 SQL 代码的答案,它现在应该像现在这样工作:

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

【问题讨论】:

    标签: sql sql-server sum inner-join


    【解决方案1】:

    您可以简单地从 GROUP BY 子句中删除不必要的列

      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;
    

    【讨论】:

    • 没有测试数据很难提供更好的解决方案。请您在上述问题或sqlfiddle.com 中显示它吗?
    【解决方案2】:

    请尝试:

    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
    

    【讨论】:

    • 这可能是因为内部查询中缺少别名。请立即尝试。
    猜你喜欢
    • 2014-12-29
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-14
    • 1970-01-01
    • 2021-05-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多