2010-10-14 115 views
0

嘿所有, 我一直在努力與選擇語句現在一點,我希望得到一些幫助。我目前在臨時表中有一個IP列表,我想計算這個IP作爲服務器的次數,以及它作爲客戶端的次數。不管我如何操作這個select語句,我總是會得到同樣的錯誤,告訴我ServerCount是一個無效列,無論我用什麼替換null。這裏是選擇聲明:SQL嵌套選擇無效列

select IPS, sum (ClientCount) as ClientCount, sum(ServerCount) as ServerCount 
from (
     select IP as IPS, Count(*) as ClientCount, null 
     from table1 join temp_table 
     on table1.client_ip = temp_table.IP 
     group by IP 
     union all 
     select null,IP as IPS, Count(*) as ServerCount 
     from table1 join temp_table 
     on table.server_ip = temp_table.IP 
     group by IP 
     )t 
group by IPS, ClientCount, ServerCount 

上半年和下半年獨立工作沒有工會。任何想法是什麼導致這個錯誤?另外,如果我使用空值,我也會得到第二個錯誤。這裏是空位的完整錯誤:

Msg 8155,Level 16,State 2,Line 1 't'的第3列未指定任何列。 消息207,級別16,狀態1,行13 無效的列名稱'ServerCount'。 消息207,級別16,狀態1,行1 無效的列名稱「ServerCount」。

謝謝。

+0

我會指出,當你在第一個選擇中使用聯合中的NUll創建列時,它將默認爲整數數據類型。這很好,但如果它是一個varchar或日期或十進制字段,你應該使用類似CAST(null作爲varchar(10))。 – HLGEM 2010-10-14 21:41:52

+1

比較你的SQL與你問[這個問題]時給出的答案(http://stackoverflow.com/questions/3918349/how-to-count-multiple-fields-in-sql),你會看到IP應該是兩個SELECT語句中的第一列。 – 2010-10-14 21:44:46

回答

0

執行UNION ALL時,您的列應該按照相同的順序排列。查詢通常會將第一個SELECT語句的名稱作爲列的名稱。

另外,在外部查詢中,我不確定爲什麼按聚合列分組;我不認爲這會起作用。我想你想要的東西可能是更好的東西像服務:

SELECT tt.IP, 
     (SELECT COUNT(*) FROM table1 t1 WHERE tt.IP = t1.client_ip) AS ClientCount, 
     (SELECT COUNT(*) FROM table1 t2 WHERE tt.IP = t2.server_ip) AS ServerCount 
FROM temp_table tt 
ORDER BY tt.IP 

簡單得多看,至少。

3

您需要在union的第一個查詢中定義servercount。 Aslo空可能沒有意義....我會用零代替。

select IPS, sum (ClientCount) as ClientCount, sum(ServerCount) as ServerCount 
from (
     select IP as IPS, Count(*) as ClientCount, 0 as serverCount 
     from table1 join temp_table 
     on table1.client_ip = temp_table.IP 
     group by IP 
     union all 
     select IP as IPS,0 as ClientCount, Count(*) as ServerCount 
     from table1 join temp_table 
     on table.server_ip = temp_table.IP 
     group by IP 
     )t 
group by IPS, ClientCount, ServerCount 
+0

您在第二個選擇中錯誤地排列了列,所以我修復了它們。 – HLGEM 2010-10-14 21:38:21

+0

@HLGEM ....感謝您的編輯...好趕上 – 2010-10-14 21:42:02

0

在子查詢中的第一個SELECT需要,所以你需要改變定義的所有列名:

select IP as IPS, Count(*) as ClientCount, null 

select IP as IPS, Count(*) as ClientCount, null AS ServerCount 

而且,我會改變的第二選擇在子查詢中給出相同順序的列:

select IP as IPS, null AS ClientCount, Count(*) as ServerCount 
0

您的查詢無效:

select 
    IPS, 
    sum(ClientCount) as ClientCount, 
    sum(ServerCount) as ServerCount 
from (
    select 
     IP as IPS, 
     Count(*) as ClientCount, 
     null as ServerCount 
    from table1 join temp_table 
    on table1.client_ip = temp_table.IP 
    group by IP 

    union all 

    select 
     null, 
     IP as IPS, 
     Count(*) 
    from table1 join temp_table 
    on table.server_ip = temp_table.IP 
    group by IP 
)t 
group by IPS, ClientCount, ServerCount 

當你有一個工會,他們從第一個查詢的列別名。您的第一個查詢需要指定ServerCount列名稱