计数/组空和非空

时间:2012-12-20 10:14:01

标签: mysql sql

我有一个带有2个文件的数据库,一个日期和一个字符串(有更多的文件,但只有这些对此有趣)字符串可以为空。现在我想计算有多少字符串是空的,有多少字符串不是。

SELECT 
  `date`, `serial`, count(`serial`) as count 
FROM 
  `updates` 
WHERE 
  `date` BETWEEN '2012-11-25 00:00:00' AND '2012-11-25 23:59:59' 
GROUP BY 
  `serial`

这是我目前的代码。我真的不知道如何以一种好的方式聚合它。

问候 亚历

//编辑

结果我希望:

2012-11-25    NULL        2452
2012-11-25    NOT NULL    3476

4 个答案:

答案 0 :(得分:2)

如果要计算空字符串而不是空值,可以使用:

SELECT
  `date`,
  count(`serial`) as count_not_nulls,
  count(case when `serial` is null then 1 end) as count_nulls
FROM `updates`
WHERE `date` BETWEEN '2012-11-25 00:00:00' AND '2012-11-25 23:59:59'
GROUP BY `date`

修改

SELECT `date`, 'NOT NULL', count(`serial`) as count
FROM `updates`
WHERE `date` BETWEEN '2012-11-25 00:00:00' AND '2012-11-25 23:59:59'
     AND `serial` is not null
GROUP BY `date`
UNION
SELECT `date`, 'NULL', count(1) as count
FROM `updates`
WHERE `date` BETWEEN '2012-11-25 00:00:00' AND '2012-11-25 23:59:59'
      AND `serial` is null
GROUP BY `date`

答案 1 :(得分:1)

简而言之

SELECT 
  DATE( `date` ) the_date, 
  CASE WHEN serial IS NULL THEN 'NULL' ELSE 'NOT NULL' END sernull, 
  COUNT(*)
FROM 
  updates
WHERE
  DATE( `date` ) = '2012-11-25'
GROUP BY 
  the_date, 
  sernull

SQL Fiddle DEMO

答案 2 :(得分:0)

这为您提供了serial不为空的计数

SELECT `date`, `serial`, count(`serial`) as count
FROM `updates`
WHERE `date` BETWEEN '2012-11-25 00:00:00' AND '2012-11-25 23:59:59' 
and serial is not null
GROUP BY `serial`

这将为您提供serial为null的计数

SELECT `date`, `serial`, count(`serial`) as count
FROM `updates`
WHERE `date` BETWEEN '2012-11-25 00:00:00' AND '2012-11-25 23:59:59' 
and serial is  null
GROUP BY `serial`

答案 3 :(得分:0)

希望这对你有所帮助。试试这个 -

SELECT 'date','serial',count('serial') as count
FROM
(SELECT 'date',
           CASE WHEN 'serial'  is null THEN `NULL'
                   ELSE 'NOT NULL' END as serial
FROM `updates` WHERE `date` BETWEEN '2012-11-25 00:00:00' AND '2012-11-25 23:59:59' )
GROUP BY 'date,'serial'

祝你好运!