SQL服务器计数数据集在不同的结果中没有subselect

时间:2011-03-16 15:30:20

标签: sql sql-server

下表(STAT_BC):

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年 有任何想法吗? 谢谢!

3 个答案:

答案 0 :(得分:0)

您应该能够使用case语句在年份不是2010时返回null

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

答案 1 :(得分: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年的节点,你可以选择外连接。作为一种做法,我们不应该使用关键字作为列标识符。

答案 2 :(得分: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