2013-06-27 17 views
0

我目前正在運行以下查詢(請參閱下文)但是,當我運行此查詢時,活動用戶和掛起的用戶將帶回一個更大的結果,然後在數據庫中。小計查詢帶回更多結果然後可能

我只是想知道你是否可以闡明爲什麼並糾正我錯在哪裏的原因?

SELECT c.[Status], 
     c.CompanyId, 
     c.Name, 
     (SELECT count(DISTINCT usr.UserID) 
     FROM [ondemand.10cms.com].Security.[user] usr 
       INNER JOIN [ondemand.10cms.com].Company.Company 
       ON usr.CompanyID = c.CompanyID) AS TotalUsers, 
     (SELECT sum (CASE 
         WHEN usr.Status = 2 THEN 1 
         ELSE 0 
        END) 
     FROM [ondemand.10cms.com].Security.[user] usr 
       INNER JOIN [ondemand.10cms.com].Company.Company 
       ON usr.CompanyID = c.CompanyID) AS ActiveUsers, 
     (SELECT sum (CASE 
         WHEN usr.Status = 3 THEN 1 
         ELSE 0 
        END) 
     FROM [ondemand.10cms.com].Security.[User] usr 
       INNER JOIN [ondemand.10cms.com].Company.Company 
       ON usr.CompanyID = c.CompanyID) AS SuspendedUsers 
FROM [ondemand.10cms.com].Company.Company c 
+1

檢查您的連接沒有通過選擇退出多餘行 –

回答

3

在每一個你有兩個表的子查詢,一個被連接到外查詢,但有兩個內表之間沒有連接。所有這些子查詢都有點沒有必要,我會改寫爲一個簡單的查詢,像這樣:

SELECT 
    Company.[Status] 
    ,Company.CompanyId 
    ,Company.Name 
    ,COUNT(DISTINCT usr.UserID) AS TotalUsers 
    ,SUM(CASE WHEN usr.Status = 2 THEN 1 
      ELSE 0 
      END) AS ActiveUsers 
    ,SUM(CASE WHEN usr.Status = 3 THEN 1 
      ELSE 0 
      END) AS SuspendedUsers 
FROM [ondemand.10cms.com].Security.[user] usr 
    INNER JOIN [ondemand.10cms.com].Company.Company 
      ON usr.CompanyID = Company.CompanyID 
GROUP BY 
    Company.[Status] 
    ,Company.CompanyId 
    ,Company.Name 

如果你只是WABT修復您所查詢的是那麼試試這個:

SELECT c.[Status], 
     c.CompanyId, 
     c.Name, 
     (SELECT count(DISTINCT usr.UserID) 
     FROM [ondemand.10cms.com].Security.[user] usr 
       INNER JOIN [ondemand.10cms.com].Company.Company 
       ON usr.CompanyID = Company.CompanyID 
     WHERE usr.CompanyID = c.CompanyID) AS TotalUsers, 
     (SELECT sum (CASE 
         WHEN usr.Status = 2 THEN 1 
         ELSE 0 
        END) 
     FROM [ondemand.10cms.com].Security.[user] usr 
       INNER JOIN [ondemand.10cms.com].Company.Company 
       ON usr.CompanyID = Company.CompanyID 
     WHERE usr.CompanyID = c.CompanyID) AS ActiveUsers, 
     (SELECT sum (CASE 
         WHEN usr.Status = 3 THEN 1 
         ELSE 0 
        END) 
     FROM [ondemand.10cms.com].Security.[User] usr 
       INNER JOIN [ondemand.10cms.com].Company.Company 
       ON usr.CompanyID = Company.CompanyID 
     WHERE usr.CompanyID = c.CompanyID) AS SuspendedUsers 
FROM [ondemand.10cms.com].Company.Company c 
+0

+1輕鬆地錯過了交叉連接。 –

+0

不幸的是,這是可能的,因爲它是一個比這更大的查詢,這只是它的一個片段。在原始查詢期間,我還嘗試了一個類似的查詢,然後在原始查詢中斷開,並且不會返回必要的信息。 –

+0

@Tim - 也爲您的查詢添加了一個直接修復。 –

0

我不知道你的數據(它可能會導致重複),但是你不能使用標準組而不使用子查詢?

Select 
    c.[Status], 
    c.CompanyId, 
    c.Name, 
    count(distinct usr.UserID) as TotalUsers, 
    sum(case when usr.Status = 2 then 1 else 0 end) as ActiveUsers, 
    sum(case when usr.Status = 3 then 1 else 0 end) as SuspendedUsers 
from [ondemand.10cms.com].Company.Company c 
inner join [ondemand.10cms.com].Security.[user] usr 
    on usr.CompanyID=c.CompanyID 
GROUP BY 
    c.[Status], 
    c.CompanyId, 
    c.Name 
0

嘗試增加一組由CompanyId,讓我們知道該如何工作。

相關問題