0

現在、次のクエリを実行しています (以下を参照してください)。ただし、実行すると、totalusers、activeusers、suspendusers の複数の行に対して同じ値が返されます。ただし、ログインの合計に関しては、値は一意です。彼らはこれが起こっている理由であり、問​​題を解決する方法です. postgre sqlドライバーでツールsql workbenを使用するのに役立つ場合。

乾杯

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 
4

2 に答える 2

0

その理由はcompany、これらの計算のサブクエリに含まれているためです。

from可能であれば、節でテーブル参照を使用することをお勧めします。次のクエリを記述して、すべてを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;

これにより、同じ作業を複数回行う必要がないため、クエリも高速化されます。

于 2013-07-08T14:31:10.907 に答える
0

TotalUsers、ActiveUsers、および SuspendedUsers クエリはすべて Company テーブルの独自の (無制限の) コピーを使用しているのに対し、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
于 2013-07-08T14:31:06.407 に答える