2015-07-28 70 views
1

我一直在尝试完成这个工会,在同一张桌子上的连接和嵌套选择,但我不能得到我需要的结果。多个选择与聚合在同一张桌子上

因此,要启动:所有我需要的数据是表1,其短版的结构是这样的:

OWNERIDVARCHAR(25)
supervisorIDVARCHAR(25 )
statusIDINT

样品的数据是:

john.smith | joe.blogs | 1 
john.smith | joe.blogs | 1 
john.smith | joe.blogs | 1 
john.smith | joe.blogs | 2 
jane.doe | joe.blogs | 1 
jane.doe | joe.blogs | 1 
jane.doe | joe.blogs | 1 
jane.doe | joe.blogs | 1 
billy.bob | mary.jane | 1 
billy.bob | mary.jane | 2 

我希望得到什么,以伪SQL将是:

SELECT ownerID, COUNT(*) as CountOne, COUNT(*) as CountTwo 
FROM table1 
WHERE supervisorID='joe.blogs'AND statusID=1 
OR supervisorID='joe.blogs'AND statusID=2 
GROUP BY ownerID 

产生以下结果:

userID | countOne | countTwo 
---------------------------------- 
john.smith |  3 | 1 
---------------------------------- 
jane.doe |  4 | 0 

明显的伪SQL没有权利工作,但正如我所说我尝试过使用UNION,JOIN在同一张桌子上,嵌套选择,并要求谷歌,但没有我产生会给我所需的结果:(

数据库正在使用PostreSQL。

+0

_PostreSql_或_PostgreSQL_? –

回答

1

你可以用它代替COUNT SUM和总结只有那些符合你需要的statusId价值观 - 为CountOne - >状态= 1,对于CountTwo - >状态= 2:

SELECT ownerId, 
     SUM(CASE WHEN statusId = 1 THEN 1 ELSE 0 END), 
     SUM(CASE WHEN statusId = 2 THEN 1 ELSE 0 END) 
FROM table1 
WHERE supervisorId = 'joe.blogs' 
GROUP BY ownerId 

希望它有帮助。

+0

太棒了!从来没有想过使用SUM的。我试过类似COUNT而不是SUM,但第一次计数是正确的,但第二次是第一次 – Peter

0

试试这个

select ownerID , 
sum(case when statusID =1 then 1 else 0 end) as countOne, 
sum(case when statusID =2 then 1 else 0 end) as countTwo 
from table1 
group by ownerID 
相关问题