如果不为null,则按字段计数

时间:2016-06-23 15:26:25

标签: mysql count null group-by distinct

我有以下2个表格:

CALLS:

id | date       | user_id
-------------------------
1  | 2016-06-22 | 1
2  | 2016-06-22 | NULL
3  | 2016-06-22 | NULL
4  | 2016-06-23 | 2
5  | 2016-06-23 | 1
6  | 2016-06-23 | 1
7  | 2016-06-23 | NULL

付款:

id | date       | user_id | value
---------------------------------
1  | 2016-06-22 | 1       | 10
2  | 2016-06-22 | 3       | 15
3  | 2016-06-22 | 4       | 20
4  | 2016-06-23 | 2       | 100
5  | 2016-06-23 | 1       | 150

我尝试构建查询以检索以下输出:

date       | distinct_calls | income
------------------------------------
2016-06-22 | 1              | 10
2016-06-22 | NULL           | 0
2016-06-22 | NULL           | 0
2016-06-23 | 2              | 250
2016-06-23 | NULL           | 0

输出应计算CALLS表中的 DISTINCT USER_ID,并将它们按DATE分组,但仅限于USER_ID不为空。如果此字段为null,则每个null应为1行。这就是2016-06-22有3个输出行的原因,其中2个是NULL调用。我还尝试添加第三个输出列,其中包含当天PAIMENTS表中VALUE字段的总和。但是这个总和应该只考虑在给定的一天中其USER_ID出现在CALLS表中的战斗。这就是为什么第一个输出行的收入值是10而不是10 + 15 + 20的原因,因为此日期的CALLS表中没有USER_ID 3和4。

现在,我的查询如下:

SELECT calls.date, IF(calls.user_id IS NULL, NULL, COUNT(calls.id)) AS distinct_calls 
FROM calls 
GROUP BY calls.date, IF(calls.user_id IS NULL, calls.id, "not null")

但是这个查询会产生以下输出:

date       | distinct_calls
---------------------------
2016-06-22 | NULL
2016-06-22 | NULL
2016-06-22 | 1
2016-06-23 | NULL
2016-06-23 | 3

哪个错了。应该有

date       | distinct_calls     
---------------------------
2016-06-22 | NULL
2016-06-22 | NULL
2016-06-22 | 1
2016-06-23 | NULL
2016-06-23 | 2

任何帮助都会被理解为更正第一个输出,然后添加第3个收入列值。

这是表原始数据:

--
-- Structure de la table `calls`
--

CREATE TABLE IF NOT EXISTS `calls` (
  `id` int(11) NOT NULL,
  `date` date NOT NULL,
  `user_id` int(11) DEFAULT NULL
) ENGINE=InnoDB AUTO_INCREMENT=8 DEFAULT CHARSET=utf8;

--
-- Contenu de la table `calls`
--

INSERT INTO `calls` (`id`, `date`, `user_id`) VALUES
(1, '2016-06-22', 1),
(2, '2016-06-22', NULL),
(3, '2016-06-22', NULL),
(4, '2016-06-23', 2),
(5, '2016-06-23', 1),
(6, '2016-06-23', 1),
(7, '2016-06-23', NULL);

-- --------------------------------------------------------

--
-- Structure de la table `payments`
--

CREATE TABLE IF NOT EXISTS `payments` (
  `id` int(11) NOT NULL,
  `date` date NOT NULL,
  `user_id` int(11) NOT NULL,
  `value` int(11) NOT NULL
) ENGINE=InnoDB AUTO_INCREMENT=6 DEFAULT CHARSET=utf8;

--
-- Contenu de la table `payments`
--

INSERT INTO `payments` (`id`, `date`, `user_id`, `value`) VALUES
(1, '2016-06-22', 1, 10),
(2, '2016-06-22', 3, 15),
(3, '2016-06-22', 4, 20),
(4, '2016-06-23', 2, 100),
(5, '2016-06-23', 1, 150);

--
-- Index pour les tables exportées
--

--
-- Index pour la table `calls`
--
ALTER TABLE `calls`
  ADD PRIMARY KEY (`id`);

--
-- Index pour la table `payments`
--
ALTER TABLE `payments`
  ADD PRIMARY KEY (`id`);

--
-- AUTO_INCREMENT pour les tables exportées
--

--
-- AUTO_INCREMENT pour la table `calls`
--
ALTER TABLE `calls`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=8;
--
-- AUTO_INCREMENT pour la table `payments`
--
ALTER TABLE `payments`
  MODIFY `id` int(11) NOT NULL AUTO_INCREMENT,AUTO_INCREMENT=6;

1 个答案:

答案 0 :(得分:1)

您可以使用以下两个查询来获取

SELECT p.date, 
       Count(*)     AS distinct_call, 
       Sum(p.value) AS income 
FROM   payments p 
INNER JOIN (SELECT id, 
                   date, 
                   user_id, 
                   Count(*) 
            FROM   calls 
            WHERE  user_id IS NOT NULL 
            GROUP  BY date, 
                      user_id) c 
        ON c.user_id = p.user_id 
       AND c.date = p.date 
GROUP  BY p.date; 

<强>输出:

+------------+---------------+--------+
| date       | distinct_call | income |
+------------+---------------+--------+
| 2016-06-22 |             1 |     10 |
| 2016-06-23 |             2 |    250 |
+------------+---------------+--------+

2行(0.00秒)

的MySQL&GT;选择日期,user_id为distinct_call,0作为来自user_id为null的调用的收入;

+------------+---------------+--------+
| date       | distinct_call | income |
+------------+---------------+--------+
| 2016-06-22 |          NULL |      0 |
| 2016-06-22 |          NULL |      0 |
| 2016-06-23 |          NULL |      0 |
+------------+---------------+--------+

3行(0.00秒)