2010-10-14 9 views
0

Привет всем, Я немного борется с выражением выбора, и я надеялся получить некоторую помощь. В настоящее время у меня есть список IP-адресов во временной таблице, и я хочу рассчитать, сколько раз этот IP-сервер действует как сервер и сколько раз он действует как клиент. Независимо от того, как я манипулирую этим предложением select, я всегда получаю ту же ошибку, указывающую, что ServerCount - это недопустимый столбец, независимо от того, что я заменяю нулями. Вот выдержка:sql inested select invalid column

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, уровень 16, состояние 2, строка 1 Для столбца 3 't' не указан столбец. Msg 207, уровень 16, состояние 1, строка 13 Недопустимое имя столбца 'ServerCount'. Msg 207, уровень 16, состояние 1, строка 1 Недопустимое имя столбца 'ServerCount'.

Спасибо.

+0

Я укажу, что при использовании NUll в объединении для создания столбца при первом выборе он будет по умолчанию иметь целочисленный тип данных. Это нормально для этого, но если это было поле varchar или date или decimal, которое вы хотели, вы должны использовать что-то вроде CAST (null как varchar (10)). – HLGEM

+1

Сравните ваш SQL с ответом, который был задан, когда вы задали [этот вопрос] (http://stackoverflow.com/questions/3918349/how-to-count-multiple-fields-in-sql), и вы увидите, что IP должен быть первым столбцом в операторах SELECT. –

ответ

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

Необходимо определить номер сервера в первом запросе объединения. Aslo 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 
+0

У вас были столбцы в неправильном порядке во втором выборе, поэтому я их исправил. – HLGEM

+0

@HLGEM .... спасибо за редактирование ... good catch –

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