2015-04-23 4 views
0

У меня есть таблица, которая дает следующие входные данные sql-запроса.SQL-агрегация по группам по предложению

select server, count(*) from ServerNames where server is not null and server != '' and timestamp >= '2015-03-18' 
and timestamp <= '2015-04-19' group by server; 

Server | Count(*) 
_________________ 
Server1 1700 
Server2 1554 

select server, ip_address, count(*) from serverNames where server is not null and server != '' and ip_address is not null and ip_address != '' and timestamp >= '2015-03-18' 
and timestamp <= '2015-04-19' group by server, ip_address; 

Server | ip_address  | count(*) 
______________________________________ 
Server1 Sample_ip_1   14 
Server2 Sample_ip_2   209 
Server1 Sample_ip_2   100 
Server1 Sample_ip_1   50 

Мне сложно написать запрос, который вычисляет процент внутри группы. Так, например, в моем примере вывод должен быть.

Server | ip_address | Count(*) | percent 
________________________________________________ 
Server1 Sample_ip_1 14   0.82% (14/1700) 
Server2 Sample_ip_2 209   13.44%(209/1554) 
Server1 Sample_ip_2 100   5.88%(100/1700) 
Server2 Sample_ip_1 50   3.217(15/1554) 

Как написать запрос для этого?

+0

Счетчик (*) со второго выхода/счетчика (*) от первого. – station

+0

присоединяется к двум запросам и вычисляет проценты таким образом –

ответ

1

Вам нужно всего лишь объединить результаты двух ваших запросов, а затем concat кучу вещей, чтобы получить значение percent, которое вы ищете. Я думаю, это должно сделать это.

select q2.server, q2.ip_address, concat(round((q2.c/q1.c) * 100, 2), '%(', q2.c, '/', q1.c, ')') as percent 
    from 
    (
     select server, count(*) c 
     from ServerNames 
     where server is not null 
      and server != '' 
      and timestamp >= '2015-03-18' 
      and timestamp <= '2015-04-19' 
     group by server 
    ) q1 
    inner join 
    (
     select server, ip_address, count(*) c 
     from serverNames 
     where server is not null 
      and server != '' 
      and ip_address is not null 
      and ip_address != '' 
      and timestamp >= '2015-03-18' 
      and timestamp <= '2015-04-19' 
     group by server, ip_address 
    ) q2 
    on q1.server = q2.server 

demo here

0

я, ради этого примера, предлагает выбор каждый из этих запросов в промежуточные таблицы А и В соответственно. Я не знаю, что представляют значения count(*), поэтому я буду называть их числителем и знаменателем соответственно.

SELECT 
    A.Server, B.ip_address, B.numerator, (B.numerator * 100.0)/A.denominator 
FROM A 
INNER JOIN B ON A.Server = B.Server 
Смежные вопросы