2013-07-08 49 views
0

我目前正在運行以下查詢(請參閱下面的內容。) 但是,當我在多用戶行,活動用戶和懸掛引擎中返回相同的值時。 但是,當涉及總登錄時,這些值是唯一的。 他們之所以會出現這種情況,是他們解決問題的一種方式。如果它有助於即時通過使用帶有Postgre sql驅動程序的工具sql workben。在sql中的多行返回相同的值,但不是所有的列

乾杯

SELECT 
    company.companyStatus, 
    company.CompanyId, 
    company.companyName, 
    select 
     count(distinct UserID) 
     From Users 
      inner join company 
       on Users.CompanyID = Company.CompanyId 
     where Users.Companyid = company.Companyid 
     as TotalUsers, 
    select sum(case when userstatusid =2 then 1 else 0 end) 
     from users 
      inner join company 
       on users.companyid = company.companyid 
     where users.companyid = company.companyid) 
     as ActiveUsers, 
    select sum(case when userstatusid = 3 then 1 else 0 end) 
     from users 
      inner join company 
       on users.companyid = company.companyid 
     where users.companyid = company.companyid) 
     as SuspendedUsers, 
    (Select COUNT (distinct usersessionid) 
    From UserSession 
     inner join users 
       on usersession.UserID=users.UserID 
    where usersession.UserID=users.UserID 
     and users.companyid= company.CompanyID) 
     as TotalLogin, 
from Company 
+1

您使用的是什麼RDBMS?當其他列返回唯一值時,某些列返回重複值並不常見。這隻意味着你從其中一個子查詢獲得了更多的值。 – woemler

回答

0

它,因爲你的TotalUsers,ActiveUsers和SuspendedUsers查詢全部使用公司表中的自己(無限制)副本,而您TotalLogin使用要從中選擇主實例。這意味着您所看到的TotalLogin數字是針對該公司的,但其他字段則跨越所有公司。

想必你想要更多的東西一樣:

SELECT 
    company.companyStatus, 
    company.CompanyId, 
    company.companyName, 
    count(distinct u.UserID) TotalUsers, 
    sum(case when u.userstatusid =2 then 1 else 0 end) ActiveUsers, 
    sum(case when u.userstatusid = 3 then 1 else 0 end) SuspendedUsers, 
    count(distinct u.usersessionid) TotalLogin 
    from Company 
    inner join Users on Users.CompanyID = Company.CompanyId 
0

的原因是因爲你必須在子查詢的那些計算company

我更喜歡具有from where子句中可能的表引用,你可以這樣寫查詢移動一切的from條款:

SELECT c.companyStatus, c.CompanyId, c.companyName, 
      uc.Totalusers, uc.Activeusers, uc.Suspendedusers, ucs.TotalLogin 
    from Company c left outer join 
     (select u.companyid, 
       COUNT(distinct userid) as Totalusers, 
       SUM(case when userstatusid = 2 then 1 else 0 end) as ActiveUsers, 
       sum(case when userstatusid = 3 then 1 else 0 end) as Suspendedusers 
      from users u 
      group by u.companyid 
     ) uc 
     uc.companyid = c.companyId left outer join 
     (select u.companyid, COUNT(distinct usersessionid) as TotalLogin 
      from UserSession us inner join 
       users u 
       on us.UserID = u.UserID 
     ) ucs 
     on ucs.companyid = c.companyid; 

這也應加快查詢,因爲它不具備多次做同樣的工作。

相關問題