SQL: вывод идет неправильно (несколько строк для статуса) - PullRequest
0 голосов
/ 30 октября 2019

Ниже приведен запрос, который я написал для получения статуса соответствия исправления.

 select 
vUI.Title As 'Title',
vui.ArticleID, 
CASE 
    WHEN vsn.StateID = 0 or vsn.StateID = 1 or vsn.StateID =  2 THEN --'No Status'
    count(vRSV.Netbios_Name0) 
END As 'No Status',
CASE
    WHEN vsn.StateID = 3 or vsn.StateID = 4 or vsn.StateID = 5 or vsn.StateID = 7 or vsn.StateID = 8 or vsn.StateID = 12 or vsn.StateID = 14 THEN --'In Progress'
    count(vRSV.Netbios_Name0) 
end as 'In Progress',
Case
    WHEN vsn.StateID = 6 or vsn.StateID = 11 or vsn.StateID = 14 THEN --'Failed'
    count(vRSV.Netbios_Name0) 
End as 'Failed',
Case
    WHEN vsn.StateID = 9 or vsn.StateID = 10 THEN --'Success'
    count(vRSV.Netbios_Name0) 
    --ELSE 'Not Installed'
END As Success
from v_UpdateComplianceStatus vUCS
join v_UpdateInfo vUI
  on vUCS.CI_ID=vUI.CI_ID
  join v_R_System_Valid vRSV  on vUCS.ResourceId=vRSV.resourceid
inner join v_FullCollectionMembership_Valid vFCMV
  on vUCS.ResourceId=vFCMV.ResourceID
  and vFCMV.CollectionID='CB00123' 
join v_GS_OPERATING_SYSTEM vGOS
    on vUCS.ResourceID = vGOS.ResourceID
join v_StateNames vSN
  on vUCS.LastEnforcementMessageID = vSN.StateID and (vSN.TopicType=402 or vSN.TopicType=500 or vSN.TopicType=400)
where vui.DateLastModified between '2019-09-12' and '2019-10-12'
  group by vUI.Title,vui.ArticleID, vsn.StateID

Я ожидал вывод, как показано ниже.

ArticleID   No Status   In Progress Failed  Success
4516033     NULL          8           102   2149

Но вывод идет, как показано ниже.

ArticleID   No Status   In Progress Failed  Success
4516033     NULL          NULL        25    NULL
4516033     NULL          NULL        NULL  253
4516033     NULL          NULL       NULL   1896
4516033     NULL          NULL        69    NULL
4516033     NULL           8           8    NULL

Любой совет, что я здесь не так делаю?

Ответы [ 2 ]

2 голосов
/ 30 октября 2019

Вы хотите условную агрегацию. CASE является аргументом функции агрегирования. Итак:

select vUI.Title As Title, vui.ArticleID, 
       sum(case when vsn.StateID in (0, 1, 2)
                then 1 else 0 
           end) as no_status,
       sum(case when vsn.StateID in (3, 4, 5, 7, 8, 12, 14)
                then 1 else 0 
           end) as in_progress,
       . . . 
from . . .
group by vUI.Title As Title, vui.ArticleID;

Обратите внимание, что вам нужно изменить и SELECT, и GROUP BY.

Также:

  • Не используйте одинарные кавычки для псевдонимов столбцов. Это просто вызывает путаницу. Одинарные кавычки должны использоваться только для констант строки и даты.
  • Выберите псевдонимы столбцов, которые не нужно экранировать (поэтому избегайте пробелов).
  • IN упрощает сравнение.
1 голос
/ 30 октября 2019

вы должны попытаться суммировать каждое значение, а не подсчитывать количество () в каждой строке

select 
vUI.Title As 'Title',
vui.ArticleID, 
sum ( CASE 
      WHEN vsn.StateID = 0 
        or vsn.StateID = 1 or vsn.StateID =  2 THEN  1 else 0 
      END  ) As 'No Status',

sum ( case 
      WHEN vsn.StateID = 3 or vsn.StateID = 4 or vsn.StateID = 5 
              or vsn.StateID = 7 or vsn.StateID = 8 
               or vsn.StateID = 12 or vsn.StateID = 14 THEN 1 else 0 

       end ) as 'In Progress',

 sum( CASE  
      WHEN vsn.StateID = 6 or vsn.StateID = 11
          or vsn.StateID = 14 
     THEN 1 else 0 

     End ) as 'Failed',
   sum( CASE WHEN vsn.StateID = 9 or vsn.StateID = 10 
      THEN 1 else 0
     END ) As Success
from v_UpdateComplianceStatus vUCS
join v_UpdateInfo vUI
  on vUCS.CI_ID=vUI.CI_ID
  join v_R_System_Valid vRSV  on vUCS.ResourceId=vRSV.resourceid
inner join v_FullCollectionMembership_Valid vFCMV
  on vUCS.ResourceId=vFCMV.ResourceID
  and vFCMV.CollectionID='CB00123' 
join v_GS_OPERATING_SYSTEM vGOS
    on vUCS.ResourceID = vGOS.ResourceID
join v_StateNames vSN
  on vUCS.LastEnforcementMessageID = vSN.StateID and (vSN.TopicType=402 or vSN.TopicType=500 or vSN.TopicType=400)
where vui.DateLastModified between '2019-09-12' and '2019-10-12'
  group by vUI.Title,vui.ArticleID
...