2015-11-09 4 views
0

Я пытаюсь вычислить количество заполненных столбцов в строке. Например, столбец Perc - это значение, которое я хочу рассчитать.Рассчитать процент заполненных столбцов в строке

id Col1 Col2 Col3 Perc 
1 NULL 1  2  75% #3 out of 4 
2 2  NULL NULL 50% #2 out of 4 
3 NULL NUll NULL 25% #1 out of 4 
4 a  Yes No 100% #4 out of 4 

Я прочитал count number of Null variables per row mysql, которым предлагает возможное решение. Однако в моем случае имена и номера столбцов часто меняются. Поэтому мне нужен более надежный запрос, который не нужно изменять каждый раз при изменении имен или столбцов.

+1

Посмотрите еще раз на нормализации – Strawberry

ответ

1

Рассмотрим следующие ...

DROP TABLE IF EXISTS my_table; 

CREATE TABLE my_table 
(id INT NOT NULL 
,item_id INT NOT NULL 
,value VARCHAR(12) NULL 
,PRIMARY KEY(id,item_id) 
); 

INSERT INTO my_table VALUES 
(1,1,NULL), 
(1,2,'1'), 
(1,3,'2'), 
(2,1,'2'), 
(2,2,NULL), 
(2,3,NULL), 
(3,1,NULL), 
(3,2,NULL), 
(3,3,NULL), 
(4,1,'a'), 
(4,2,'Yes'), 
(4,3,'No'); 

SELECT * FROM my_table; 
+----+---------+-------+ 
| id | item_id | value | 
+----+---------+-------+ 
| 1 |  1 | NULL | 
| 1 |  2 | 1  | 
| 1 |  3 | 2  | 
| 2 |  1 | 2  | 
| 2 |  2 | NULL | 
| 2 |  3 | NULL | 
| 3 |  1 | NULL | 
| 3 |  2 | NULL | 
| 3 |  3 | NULL | 
| 4 |  1 | a  | 
| 4 |  2 | Yes | 
| 4 |  3 | No | 
+----+---------+-------+ 

SELECT x.id 
    , ROUND((COUNT(value)+1)/(COUNT(*)+1)*100,2) pct 
    FROM my_table x 
GROUP 
    BY id; 
+----+--------+ 
| id | pct | 
+----+--------+ 
| 1 | 75.00 | 
| 2 | 50.00 | 
| 3 | 25.00 | 
| 4 | 100.00 | 
+----+--------+ 
+0

Насколько я могу сказать, должен быть изменен этот запрос, если количество столбцов изменить или если имя столбца изменение, которые я пытаюсь избегать. Более того, в моем случае каждая строка уникальна. – Nebu

+0

@Nebu Красота этого дизайна - это именно то, что он не делает (в отличие от вашего, что делает)! В этом дизайне столбцы никогда не нужно добавлять, только строки. В моем случае каждая строка тоже уникальна - следовательно, PRIMARY KEY (id, item_id). Это называется нормировкой. – Strawberry

+0

Да, я вижу, что вы пытаетесь сделать. Это может работать хорошо, если я использую временные таблицы. Но как мне запрограммировать INSERT INTO my_table VALUES из моей таблицы, не указывая строки и столбцы? – Nebu

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