下表(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年 有任何想法吗? 谢谢!
答案 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