none
Как использовать функцию COUNT с исключением RRS feed

  • Общие обсуждения

  • имеется вот такой простой запрос:

    SELECT     dbo.v_R_System.Netbios_Name0 as [Name],  MAX (dbo.v_GS_COMPUTER_SYSTEM.Model0) AS [Модель ПК], MAX(dbo.v_GS_X86_PC_MEMORY.TotalPhysicalMemory0 / 1024) AS [Mem],
                          MAX(dbo.v_GS_PHYSICAL_MEMORY_ARRAY.MemoryDevices0) AS [Total bank],  COUNT(dbo.v_GS_PHYSICAL_MEMORY.Speed0) AS [Occupied banks],
    MAX(dbo.v_GS_PHYSICAL_MEMORY_ARRAY.MemoryDevices0) - COUNT(dbo.v_GS_PHYSICAL_MEMORY.Speed0) AS [Free bank],
    MAX (dbo.v_GS_PHYSICAL_MEMORY.MemoryType0) AS [Memory Type]
    FROM      dbo.v_GS_PHYSICAL_MEMORY
    INNER JOIN
                          dbo.v_GS_X86_PC_MEMORY ON  dbo.v_GS_PHYSICAL_MEMORY.ResourceID = dbo.v_GS_X86_PC_MEMORY.ResourceID
    INNER JOIN
                          dbo.v_GS_PHYSICAL_MEMORY_ARRAY ON  dbo.v_GS_PHYSICAL_MEMORY.ResourceID = dbo.v_GS_PHYSICAL_MEMORY_ARRAY.ResourceID
    INNER JOIN
                          dbo.v_GS_COMPUTER_SYSTEM ON  dbo.v_GS_PHYSICAL_MEMORY.ResourceID = dbo.v_GS_COMPUTER_SYSTEM.ResourceID
    INNER JOIN
                         dbo.v_R_System ON  dbo.v_GS_PHYSICAL_MEMORY.ResourceID =   dbo.v_R_System.ResourceID

    GROUP BY dbo.v_R_System.Netbios_Name0

    Делается выборка по занятым слотам памяти. Но так как у меня кроме реальной памяти присутствует ещё строка SYSTEM ROM, которую необходимо исключить, а как это сделать, непонятно совсем :(

    так как содержимое таблицы dbo.v_GS_PHYSICAL_MEMORY примерно такое: 

     

     120   1   1   1   04.02.2011 0:13:33     512   Physical Memory   Win32_PhysicalMemory   XMM3   8   JEDEC ID:7F 7F 7F 7F 7F 51 00 00   21   1   667   Physical Memory 2 
     120   2   1   1   04.02.2011 0:13:33     1024   Physical Memory   Win32_PhysicalMemory   XMM1   8   JEDEC ID:7F 7F 7F 7F 7F 51 00 00   21   1   800   Physical Memory 0 
     120   3   1   1   04.02.2011 0:13:33     512   Physical Memory   Win32_PhysicalMemory   XMM2   8   JEDEC ID:7F 7F 7F 7F 7F 51 00 00   21   1   667   Physical Memory 1 
     120   4   1   1   04.02.2011 0:13:33     4   Physical Memory   Win32_PhysicalMemory   SYSTEM ROM   0     11   1     Physical Memory 4 


    И непонятно, почему COUNT не исключает нулевое значение для SYSTEM ROM во поле Speed0 ... :(


    29 апреля 2011 г. 12:03

Все ответы

  • в конце

    where v_GS_PHYSICAL_MEMORY.DeviceLocator0 <>  'SYSTEM ROM'

    только в вашем случае, это исключит один из многих вариантов

  • В том-то и дело, что мне надо сделать исключение именно для функции COUNT, а она не хочет этого делать, даже если значение NULL. Значения Speed0 для SYSTEM ROM нет, или оно его воспринимает как пробел, а не как NULL ? Ведь функция COUNT возвращает кол-во ненулевых значений в таблице.

    Вот мой отчёт:

    SELECT    
    dbo.v_R_System.Netbios_Name0 as [Name],
    MAX(dbo.v_GS_PHYSICAL_MEMORY_ARRAY.MemoryDevices0) AS [Total banks],
    COUNT(dbo.v_GS_PHYSICAL_MEMORY.Speed0) AS [Occupied banks],
    MAX(dbo.v_GS_PHYSICAL_MEMORY_ARRAY.MemoryDevices0) - COUNT(dbo.v_GS_PHYSICAL_MEMORY.Speed0) AS [Free bank],
    MAX (dbo.v_GS_PHYSICAL_MEMORY.MemoryType0) AS [Memory Type]
    FROM      dbo.v_GS_PHYSICAL_MEMORY
    INNER JOIN
                          dbo.v_GS_X86_PC_MEMORY ON  dbo.v_GS_PHYSICAL_MEMORY.ResourceID = dbo.v_GS_X86_PC_MEMORY.ResourceID
    INNER JOIN
                          dbo.v_GS_PHYSICAL_MEMORY_ARRAY ON  dbo.v_GS_PHYSICAL_MEMORY.ResourceID = dbo.v_GS_PHYSICAL_MEMORY_ARRAY.ResourceID
    INNER JOIN
                          dbo.v_GS_COMPUTER_SYSTEM ON  dbo.v_GS_PHYSICAL_MEMORY.ResourceID = dbo.v_GS_COMPUTER_SYSTEM.ResourceID
    INNER JOIN
                         dbo.v_R_System ON  dbo.v_GS_PHYSICAL_MEMORY.ResourceID =   dbo.v_R_System.ResourceID
    GROUP BY dbo.v_R_System.Netbios_Name0

    А вот пример резальтата: (тут комппьютеры 1-4 отображает корректно, а вот 5-6 - нет, имеено из-за этого SYSTEM ROM..)

     
    Computer1  4   1   3   1 
    Computer2  4   1   3   1 
    Computer3  2   2   0   17 
    Computer4  2   2   0   0 
    Computer5  4   4   0   21 
    Computer6  4   6   -2   21 
  • это я уже давно прочитал... ( а как написать запрос в моему случае - непонятно :(

    И почему тогда функция COUNT из таблицы типа (снизу показана), COUNT(dbo.v_GS_PHYSICAL_MEMORY.Speed0) возвращает значение 6, а не 3.

     
     800 
     800 
     800 
     (пустая строка)

     

    Или из таблицы типа (снизу), COUNT(dbo.v_GS_PHYSICAL_MEMORY.Speed0) возвращает 4, а не 2

     
     800 
     800 
     (пустая строка)

     

    Можно было бы просто делить на два, но такие рез-ты только для тех компьютеров, у которых есть этот SYSTEM ROM ...((