大家好,我已经在select语句上挣扎了一段时间,我希望能得到一些帮助。我目前在一个临时表中有一个IP列表,我想计算这个IP作为服务器的次数和它作为客户端的次数。无论我如何插入这个select语句,我总是得到相同的错误,告诉我ServerCount是一个无效的列,无论我用什么替换空值。下面是select语句:
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前半部分和后半部分在没有联合的情况下独立工作。你知道是什么导致了这个错误吗?另外,如果我使用Nulls,我也会得到第二个错误。以下是包含空值的完整错误:
Msg 8155,Level 16,State 2,Line 1没有为't‘的第3列指定列。消息207,级别16,状态1,第13行列名'ServerCount‘无效。消息207,第16级,状态1,第1行列名'ServerCount‘无效。
谢谢。
发布于 2010-10-15 05:41:00
在执行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至少看起来简单多了。
发布于 2010-10-15 05:35:36
您需要在联合的第一个查询中定义servercount。同样,null可能没有任何意义。我会用零代替。
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发布于 2010-10-15 05:37:19
子查询中的第一个SELECT需要定义所有列名,因此您需要更改:
select IP as IPS, Count(*) as ClientCount, null至
select IP as IPS, Count(*) as ClientCount, null AS ServerCount另外,我将更改子查询中的第二个SELECT语句,使列的顺序相同:
select IP as IPS, null AS ClientCount, Count(*) as ServerCounthttps://stackoverflow.com/questions/3937759
复制相似问题