programing

SQL에서 두 행의 값과 두 행의 값 비율을 표시하는 방법은 무엇입니까?

randomtip 2022. 11. 1. 22:12
반응형

SQL에서 두 행의 값과 두 행의 값 비율을 표시하는 방법은 무엇입니까?

다음과 같은 쿼리(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에 관련된 산술에서 두 행의 을 얻는 방법을 잘 모르겠습니다.조언해 주셔서 감사합니다!

행이 아닌 세 개의 개별 열로 사용할 수 있는 경우 다음을 수행할 수 있습니다.

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 ;

이 설정을 해제하는 것이 가장 간단할 수도 있습니다.

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_status1회(작은 테이블에는 큰 문제가 아닐 수도 있지만)

당신이 지정한 코드가 이 답을 주는 데 효과가 있을 거라 생각했는데요.

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';

동작하지 않는 경우의 코멘트.행운을 빌어요.

이것은 동작합니다.

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
);

삽입과 히트 결과가 다르므로 아래와 같이 두 개의 별도 서브쿼리를 합산하여 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')

언급URL : https://stackoverflow.com/questions/55777443/in-sql-how-to-show-values-of-two-rows-and-ratio-of-the-values-of-those-two-rows

반응형