2010-10-14 83 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列名称