В SQL, как показать значения двух строк и соотношение значений этих двух строк? - PullRequest
1 голос
/ 20 апреля 2019

У меня есть запрос (в MySQL, но это общий вопрос SQL), который выглядит так:

SELECT 'Hits', variable_value 
FROM global_status 
WHERE variable_name = 'QCACHE_HITS'

UNION

SELECT 'Inserts', variable_value 
FROM global_status 
WHERE variable_name = 'QCACHE_INSERTS';  

Это дает следующий результат:

+---------+----------------+
| Hits    | variable_value |
+---------+----------------+
| Hits    | 8330           |
| Inserts | 7075           |
+---------+----------------+

То, к чему я пытаюсь добраться, это соотношение этих двух, которые находятся в одном и том же SQL. В основном набор результатов выглядит следующим образом:

+---------+----------------+
| Hits    | variable_value |
+---------+----------------+
| Hits    | 8330           |
| Inserts | 7075           |
| H/I     | 1.177
+---------+----------------+

Как составить этот SQL? Я думаю, что JOIN может быть необходимо, но я не уверен, как получить значение из двух строк для математики, участвующей в SQL. Спасибо за любые указатели!

Ответы [ 4 ]

2 голосов
/ 21 апреля 2019

Если вы можете принять их как три отдельных столбца , а не строк , вы можете сделать:

select h.hits,
       (case when h.hits = 'hits' then hits
             when h.hits = 'inserts' then inserts
             else ratio
        end) 
from (select max(case when variable_name = 'QCACHE_HITS' then variable_value end) as hits,
             max(case when variable_name = 'QCACHE_INSERTS' then variable_value end) as inserts,
             (max(case when variable_name = 'QCACHE_HITS' then variable_value end) /,
              max(case when variable_name = 'QCACHE_INSERTS' then variable_value end)
             ) as ratio
      from global_status
     ) s cross join
     (select 'hits' as hits union all
      select 'inserts' union all
      select 'h/i'
     ) x;

Это может показаться сложным, но в основном это только сканирование global_status один раз (хотя это может не иметь большого значения для небольшого стола).

1 голос
/ 20 апреля 2019

Поскольку результаты вставок и попаданий различаются, просто объедините и разделите два отдельных подзапроса, как показано ниже, и получите o / p

Кроме того, объединение не требуется, поскольку вам не нужен дополнительный столбец или т. Д., Но дополнительная строкаданные

   .... UNION
       Select 'H/I',(SELECT  variable_value 
      FROM global_status 
      WHERE variable_name = 
       'QCACHE_HITS')
       /
    (  SELECT variable_value 
     FROM global_status 
      WHERE variable_name = 
      'QCACHE_INSERTS')
1 голос
/ 20 апреля 2019

Я предположил, что ваш код работает, чтобы дать этот ответ.

SELECT 'Hits', variable_value 
FROM global_status 
WHERE variable_name = 'QCACHE_HITS'
UNION
SELECT 'Inserts', variable_value 
FROM global_status 
WHERE variable_name = 'QCACHE_INSERTS'
UNION
SELECT 'H/I', (
(SELECT variable_value FROM global_status WHERE variable_name='QCACHE_HITS')
/
(SELECT variable_value FROM global_status WHERE variable_name = 'QCACHE_INSERTS')
) AS 'variable_value';

Рекомендую, если не работает. Удачи.

1 голос
/ 20 апреля 2019

это будет работать:

SELECT 'Hits', variable_value 
FROM global_status 
WHERE variable_name = 'QCACHE_HITS'

UNION

SELECT 'Inserts', variable_value 
FROM global_status 
WHERE variable_name = 'QCACHE_INSERTS'

UNION

select 'H/I',(SELECT variable_value 
FROM global_status 
WHERE variable_name = 'QCACHE_HITS')/(SELECT variable_value 
FROM global_status 
WHERE variable_name = 'QCACHE_INSERTS') as variable_value
);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...