user3017424
user3017424

Reputation: 65

SQL Case Statement COUNT

I need to do a case statement, group the results and count the results in my SQL query. I have done this so far but not quite sure how to get it to work properly:

SELECT 'OS' = 
    CASE
        WHEN OS.Info LIKE 'AIX %' THEN 'Unix'
        WHEN OS.Info LIKE 'LINUX%' THEN 'Unix'
    END, COUNT( 'OS' )
FROM Asset A (NOLOCK)
LEFT JOIN Asset_IP AIP (NOLOCK) ON A.AssetID = AIP.AssetID AND AIP.LastUpdateDate = (SELECT MAX( Asset_IP.LastUpdateDate ) FROM Asset_IP (NOLOCK) WHERE A.AssetID = Asset_IP.AssetID)
LEFT JOIN Asset_IP_OS AIPOS (NOLOCK) ON AIP.AssetIPID = AIPOS.AssetIPID
LEFT JOIN OSNav OS (NOLOCK) ON AIPOS.OSNavID = OS.OSNavID
GROUP BY OS.Info
ORDER BY OS.Info

The OS may come up as AIX 7.0 or AIX 7.2 or Linux 2.3 or Windows 7 or Solaris 10. All the Unix based OS must be under Unix with a count, etc... I would like it to show something like this:

OS      Count
Unix    200
Windows 1200

Upvotes: 0

Views: 107

Answers (1)

Pரதீப்
Pரதீப்

Reputation: 93694

You need to use CASE statement in Group By or use derived table to use the Alias name OS in group by . Since we have removed OS.Info in group by, we cannot use OS.Info in order by. Use alias name OS in Order by

SELECT OS = CASE
              WHEN OS.Info LIKE 'AIX %'
                    OR OS.Info LIKE 'LINUX%' THEN 'Unix'
              ELSE 'Others' --default
            END,
       Count(OS.Info)
FROM   Asset A (NOLOCK)
       LEFT JOIN Asset_IP AIP (NOLOCK)
              ON A.AssetID = AIP.AssetID
                 AND AIP.LastUpdateDate = (SELECT Max(Asset_IP.LastUpdateDate)
                                           FROM   Asset_IP (NOLOCK)
                                           WHERE  A.AssetID = Asset_IP.AssetID)
       LEFT JOIN Asset_IP_OS AIPOS (NOLOCK)
              ON AIP.AssetIPID = AIPOS.AssetIPID
       LEFT JOIN OSNav OS (NOLOCK)
              ON AIPOS.OSNavID = OS.OSNavID
GROUP  BY CASE
            WHEN OS.Info LIKE 'AIX %'
                  OR OS.Info LIKE 'LINUX%' THEN 'Unix'
            ELSE 'Others'
          END
ORDER  BY OS 

Note : I have added else statement to avoid NULL's when expressions are not satisfied..

Upvotes: 1

Related Questions