2015-10-28 2 views
4

У меня есть таблица, где коды записаны нашими поставщиками после обследования пациентов. Коды выглядят как A11, B99, C68, A12, O87, F76 и т. Д. Теперь мне нужно создать отчет, в котором эти коды сгруппированы и подсчитаны. Группы должны выглядеть как A00-B99, C00-D48, D50-D89 и т. Д. Я исследовал и нашел, что мне, возможно, придется использовать REGEXP, который я хочу избежать, насколько смогу. Может кто-то, пожалуйста, помогите, каков эффективный и оптимизированный способ сделать это?Mysql Группировка данных и регулярное выражение

Таблица:

ID Codes description 
    1 A11  Infection 
    2 A01  Intestinal infectious diseases 
    3 H77  Intestinal infectious diseases  
    5 D98  Intestinal infectious diseases  
    6 D98  Intestinal infectious diseases 
    7 A11  Intestinal infectious diseases 
    8 A00  Intestinal infectious diseases 
    9 A03  Intestinal infectious diseases 
    10 D00  Intestinal infectious diseases 
11 D98  Intestinal infectious diseases 
... 
... 
... 
... 

Желаемая Result

code_group Count 
A00-B99  10 
C00-D48  50 
D50-D89  100 
... 
... 
... 

Я надеюсь, что я объяснил этот вопрос.

Спасибо за помощь!

+0

Добро пожаловать в Stackoverflow.com. Вы должны показать нам, что вы пробовали. Это выглядит как домашнее задание. – user3741598

+1

Это не похоже на домашнюю работу, это похоже на медицинскую запись. –

+0

Есть ли какие-нибудь рифмы или причины для группировок? Я вижу, что в вашем примере это все. Так же, как и все Bs и половина Cs ... затем другая половина Cs и Ds. – Chizzle

ответ

3

Вы можете использовать case заявление для агрегирования:

select (case when code between 'A00' and 'A99' then 'A00-A99' 
      when code between 'B00' and 'C48' then 'B00-C48' 
      when code between 'C49' and 'D99' then 'C49-D99' 
      . . . 
     end) as codeGroup, 
     count(*) 
from t 
group by codeGroup 
order by codeGroup; 
+0

Я объединил ваше решение с PHP для составления динамических операторов case. \t \t '$ SQL = "SELECT (случай "; \t \t Еогеасп ($ diagnosisCategories AS $ категории) { \t \t \t $ splittedCategories = взорваться (" -", $ категории); \t \t \t $ SQL . = "WHEN b.code BETWEEN '". $ SplittedCategories [0]. "И". $ SplittedCategories [1]. "" THEN' ". $ Category." '"; \t \t} $ sql. = "end) как codeGroup, COUNT (*)"; ' – Rahi

1

Вы можете, вероятно, использовать LIKE оператор MySQL, чтобы сделать это, предполагая, что коды всех трех символов. Что-то вроде этого:

SELECT "A00-A99" AS `Code Group`, COUNT(*) as `Group Count` FROM table_name as T WHERE T.Codes LIKE "A%" 

Это возвращает строку, как

Code Group Group Count 
A00-A99  44 

Для групп с диапазонами внутри письма, вы можете разбить код на части, как так:

SELECT "B00-C48" AS `Code Group`, COUNT(*) as `Group Count` 
FROM table_name as T 
WHERE T.Codes LIKE "B%" 
OR (T.Codes LIKE "C%" AND SUBSTRING(T.Codes,2) <= 48) 

Подробнее о: SUBSTRING(): https://dev.mysql.com/doc/refman/5.0/en/string-functions.html#function_substring

Чтобы сгруппировать все ваши результаты в Гефер использовать UNION ALL так:

(SELECT "A00-A99" ...) 
UNION ALL 
(SELECT "B00-C48" ...) 
UNION ALL 
... 

Хотелось бы надеяться, что поможет вам начать работу.

0

Я не знаю, зачем вам эти странные коды группировки. Даже вы запутались: вы писали группы должны выглядеть A00-B99, C00-D48, D50-D89 но в вашем желаемого результата

code_group Count 
A00-A99  10 
B00-C48  50 
C49-D99  100 

так вы использовали неправильный желаемый результат группы A00- A99, C49-D99, потому что они не совпадают с диапазонами вы объявили ранее.

Вот пример того, как группировать таблице; A00-A99; B00-B99 ...:

http://sqlfiddle.com/#!9/63229/3

SELECT 
    CONCAT(LEFT(codes,1),'00-',LEFT(codes,1),'99') gr , 
    COUNT(*) 
FROM myTable 
GROUP BY LEFT(codes,1); 

Но если вам действительно нужны эти странные диапазоны в группе я хотел бы предложить вам установить еще одну таблицу, как:

http://sqlfiddle.com/#!9/3eca4/3

CREATE TABLE myGroups (
    id INT AUTO_INCREMENT PRIMARY KEY, 
    minGr varchar(10), 
    maxGr varchar(10) 
); 

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

SELECT 
    CONCAT(g.minGr,'-',g.maxGr) gr , 
    COUNT(*) 
FROM myTable t 
INNER JOIN myGroups g 
ON t.codes>=g.minGr 
    AND t.codes<=g.maxGr 
GROUP BY g.id 
ORDER BY g.id; 
+0

Эти группы являются медицинскими стандартами. Я собираюсь попробовать! (спасибо, что указали на ошибку в разделе «Желаемый результат». Я исправил его.) – Rahi

+1

создайте таблицу группировки, тогда поверьте мне, что это лучший способ – Alex

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