2016-08-09 3 views
0

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

prv pat id flg 
001 a  SIU 
002 b  OVR 
003 c  NULL 
004 a  NULL 
004 c  NULL 
001 e  SIU 
005 c  SIU 
005 f  SIU 

ожидается выход

prv   percentage 
004   100% 
003   100% 
002   0% 

Логика здесь 004 частную имеет 2 patid т.е.

004 a  NULL 
004 c  NULL 

Но patid "а" 004 относится к 001 "а", для которого FLG является SIU, а «c» of 004 ​​принадлежит 005 «c», для которого флаг является SIU. , так что процент должен составлять 100%, потому что оба проема 004 являются SIU в других строках.

similaryly для 003, есть одна строка

003 c  NULL 

здесь процент 100%, так как "с" 003 patid принадлежит к 005, который имеет SIU флаг, поэтому для 003 его 100%

мы не будем рассчитывать для 001 и 005, потому что у них уже есть прорезь с SIU.

Ссылка для sqlfiddle http://www.sqlfiddle.com/#!9/fbd32/6/0

+0

Что, черт возьми, вы делаете? : D –

+0

Имеет ли значение флаг SIU или OVR? или просто имеет нулевое значение, а не нулевое значение? –

+1

Также странно 004 второй patid c также относится к 005, как к случаю 003, с флагом siu, так почему это 50% в случае 004 и 100 в 003? –

ответ

1

Так ваш окончательный запрос должен быть (работает, проверен):

SELECT 
    main.prv, 
    CONCAT(ROUND(SUM(pat_is_siu)/COUNT(*) * 100),'%') AS percentage 
FROM (
    SELECT 
     a.*, 
     IFNULL((SELECT 1 FROM a AS b WHERE b.`flg` = "SIU" AND b.`pat` = a.`pat` LIMIT 1),0) AS pat_is_siu 
    FROM a 
    WHERE IFNULL(a.`flg`, "") != "SIU" 
) main 
GROUP BY main.`prv` 
+0

, пожалуйста, не запускайте это на sqlfiddle, поскольку он идет вовремя –

+0

, Большое вам спасибо:). Я выполнил его против большего набора данных и посмотрю – Abid

+0

OK, поэтому в этом случае добавьте индексы в столбцы, также если вы хотите получить более точные результаты, вы должны расширить округление с помощью двух десятичных знаков: «ROUND (SUM (pat_is_siu)/COUNT (*) * 100, 2) '- добавление', 2' –

0

вы можете попробовать ниже запрос:

выбрать 100/количество (погладить ID) из таблицы, где FLG <> 'С.Ю.' группа по PRV

Смежные вопросы