2017-07-20 18 views
0

私はcase文を実行し、結果をグループ化し、SQLクエリで結果を数え上げる必要があります。私は今のところこれを実行しますが、それは正常に動作して取得する方法がかなり確実でなかった。SQL Case Statement COUNT

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 

OSはAIX 7.0またはAIX 7.2またはLinux 2.3またはWindows 7またはSolaris 10のすべてのUNIXベースとして出てくることがありあなたはGroup ByCASEステートメントを使用するか、group byにエイリアス名OSを使用するように派生テーブルを使用する必要が

OS  Count 
Unix 200 
Windows 1200 
+0

は、これをチェックしてください.sentryone.com/aaronbertrand/bad-habits-nolock-anywhere/ –

答えて

1

:OSの数、などとUnixの下でなければなりません...私はそれがこのような何かを表示したいと思います。 group byOS.Infoを削除しましたので、OS.Infoorder 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 

Order byで使用するエイリアス名OSをします。https://ブログのサイドノートで
私は式が満たされていないとき NULL'sを避けるために else文を追加した。..

+0

ありがとう、まさに私が探していたもの。ただそれがちょっと単純だったと思っています。 – user3017424