2015-09-15 2 views
0

У меня есть таблица, где у меня есть две колонки briefeng и briefbng, мне нужно подсчет общего нуль, а не нулевые значения в надлежащем порядке:MySQL сумма с именем столбца

Вот мой SQL-код:

SELECT 
Sum(If(brief_english Is Null, 1, 0)) AS briefeng, 
Sum(If(brief_english Is NOT Null, 1, 0)) AS briefengnotnull, 

Sum(If(brief_bangla Is Null, 1, 0)) AS briefbng 
FROM synopsis; 

но он возвращает результат, как таким образом:

+----------+-----------------+----------+ 
| briefeng | briefengnotnull | briefbng | 
+----------+-----------------+----------+ 
|  946 |    896 |  841 | 
+----------+-----------------+----------+ 

но мне нужен результат в этом способами

+----------+--------------+ 
| status | total   | 
+----------+--------------+ 
| briefeng |   946 | 
+----------+--------------+ 
| briefengnotnull | 896 | 
+----------+--------------+ 
| briefengnotnull | 841 | 
+----------+--------------+ 

Как я могу это сделать? Я не мог найти простой и эффективный способ.

+1

Использование 'union' или 'union all' – RubahMalam

ответ

0

Используйте союз или объединение всех, как это:

SELECT 
'briefeng' as status, 
Sum(If(brief_english Is Null, 1, 0)) AS total 
FROM synopsis 
UNION ALL 
SELECT 
'briefengnotnull' as status, 
Sum(If(brief_english Is NOT Null, 1, 0)) AS total 
FROM synopsis 
UNION ALL 
SELECT 
'briefbng' as status, 
Sum(If(brief_bangla Is Null, 1, 0)) AS total 
FROM synopsis 

Difference between Union All and Union

+0

cant use union как symfony2 не поддерживает это –

+0

@ahmad Вы можете взглянуть на это (как использовать союз в symfony): http://stackoverflow.com/questions/ 7981549/sql-query-with-union-in-doctrine-symfony – RubahMalam

+0

Я знаю это, но проблема в том, что я не хочу создавать зависимость с pdo, а хочу остаться с orm –

0
SELECT count(*) FROM tablename WHERE a IS NULL 
UNION ALL 
SELECT count(*) FROM tablename WHERE a IS NOT NULL 

или

select sum(case a when null then 1 else 0) "Null values", 
     sum(case a when null then 0 else 1) "Non-null values" 
from tablename; 

или

select sum(case when a is null then 1 else 0 end) count_nulls 
    , count(a) count_not_nulls 
    from tablename; 
+0

никто из них не работает, я пробовал такие же вещи раньше и не мог использовать union как symfony2 и doctrine querybuilder не поддерживает объединение –

0

Это правдами или неправдами рода подход, но если создать вторичную таблицу, содержащую названия с этой схемой

CREATE TABLE `titles` (
    `title` varchar(255) CHARACTER SET latin1 NOT NULL, 
    PRIMARY KEY (`title`) 
) ENGINE=MyISAM DEFAULT CHARSET=utf8 COLLATE=utf8_bin 

и эти данные

insert into `titles`(`title`) values ('briefeng'), ('briefengnotnull'), ('briefbng'); 

использовать этот запрос

SELECT t.title, IF(a.total IS NOT NULL, a.total, IF(b.total IS NOT NULL, b.total, c.total)) AS total FROM 
titles t 
LEFT JOIN (SELECT 'briefeng' AS title, SUM(IF(brief_english IS NULL, 1, 0)) AS total FROM synopsis) a ON a.title=t.title 
LEFT JOIN (SELECT 'briefengnotnull' AS title, SUM(IF(brief_english IS NULL, 0, 1)) AS total FROM synopsis) b ON b.title=t.title 
LEFT JOIN (SELECT 'briefbng' AS title, SUM(IF(brief_bangla IS NULL, 1, 0)) AS total FROM synopsis) c ON c.title=t.title 

, чтобы получить этот результат (в зависимости от записей в таблице синопсиса)

+-----------------+-------+ 
| title   | total | 
+-----------------+-------+ 
| briefbng  |  3 | 
| briefeng  |  1 | 
| briefengnotnull |  4 | 
+-----------------+-------+ 
Смежные вопросы