2011-03-16 68 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