我有以下2个表:
呼叫:
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
输出应计算不同的 USER_ID从呼叫表中并按日期进行分组,但仅当User_id不为null时。如果此字段为null,则每个null应为1行。这就是为什么2016-06-22有3个输出行,其中2行带有无呼叫。而且我还尝试添加第三个输出列,其中包含当天的Paiments表中的值字段的总和。但是,只有此款项应考虑到这一天的呼叫表中的用户_id的paiments。这就是为什么第一个输出行的收入值为10而不是10 15 20,因为该日期的呼叫表中不存在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
任何帮助都将不胜感激,以纠正第一个输出,然后添加此第三收入列值。
这是表原始数据:
--
-- 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;
您可以使用以下两个查询
获得它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 sec)
mysql>选择日期,user_id as Difinse_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 sec)