2011-03-16 67 views
1

下表(STAT_BC):SQL服务器数量的数据集,而不子查询

ID (int), Date (dateTime), NodeID (int) 

现在我想要做的分析是这样的:

SELECT COUNT(SB2.NODEID) as all, COUNT(SB1.NODEID)as y2010, SB1.NODEID 
FROM STAT_BC SB1 
JOIN STAT_BC SB2 ON SB1.ID = SB2.ID WHERE YEAR(SB2.Date)=2010 
GROUP BY SB1.NODEID 

我的经验是让所有的NodeID与计数的全部和年份2010 任何想法? 谢谢!

回答

0

你应该能够做到这一点使用一个case语句返回空当打之年不是2010

SELECT COUNT(SB1.NODEID) as all, COUNT(case when YEAR(SB1.Date)=2010 then SB1.NODEID else null end)as y2010, SB1.NODEID 
FROM STAT_BC SB1 
GROUP BY SB1.NODEID 
+0

在申请的情况下,为什么我们需要有自连接,查询,而不应该自加入公司....所以我想我们不需要SB2 ... – 2011-03-16 15:43:14

0

我认为以下查询应该给出正确的结果......

SELECT SBALL.Count as allNodes, SB2010.Count as y2010,SB2010.NODEID 
(
SELECT COUNT(SB.NODEID) as Count, SB.NODEID 
    FROM STAT_BC SB 
    GROUP BY SB.NODEID 
) SBALL 
JOIN 
(
SELECT COUNT(SB.NODEID) as Count, SB.NODEID 
    FROM STAT_BC SB 
WHERE YEAR(SB.Date)=2010 
GROUP BY SB.NODEID 
) SB2010 ON SBALL.NODEID = SB2010.NODEID 

你可以选择外连接,以防您甚至需要那些不在2010年的节点。并且作为练习,我们不应该使用关键字作为列标识符。

0

,如果你想用一个选择计算所有它,然后做:

SELECT 
    sb.NODEID, 
    (select count(*)from STAT_BC sb1 where sb1.NODEID=sb.NODEID) as all, 
    (select count(*)from STAT_BC sb2 where sb2.NODEID=sb.NODEID and YEAR(sb2.Date)=2010) as y2010 
FROM 
    STAT_BC sb