我有一个表(服务),其中包含执行它的人的ID以及服务的价值和完成日期。 我需要在同一行上按日期和ID添加服务的价值。 有可能吗?
SELECT sum(value) as total, id_user, data FROM os GROUP by data
预期:
答案 0 :(得分:0)
您的查询是无效的SQL。 MySQL允许这样做,并选择每天的值和每天任意一个用户之一。
您要求的内容,即向所有用户显示一行中的所有用户,无法在SQL中完成。在SQL查询中,始终选择先前已知的列。由于一天可以有一个用户,或者两个,或者一万个,我们显然事先并不了解所有列。
您宁愿选择行:
SELECT sum(value) as total, id_user, data
FROM os
GROUP by data, id_user
ORDER by data, id_user;
或选择连接字符串,例如:
SELECT
group_concat(concat(id_user, ': ', total) order by id_user separator ', ') as totals,
data
FROM
(
SELECT sum(value) as total, id_user, data
FROM os
GROUP by data, id_user
) sums
ORDER by data;
答案 1 :(得分:0)
如果我们可以假设:(但我可能会很好地理解这个问题)
然后以下内容应该有效:
SELECT D.ID_USER, D.Total as Total, C.ID_USER, C.Total as Total_1, c.data
FROM (SELECT A.*, @RN:=@RN+1 RN
FROM OS A
CROSS JOIN (SELECT @RN:=0) X
ORDER BY Data, ID_USER) C
INNER JOIN (SELECT B.*, @RN2:=@RN2+1 RN
FROM OS B
CROSS JOIN (SELECT @RN2:=0) X
ORDER BY Data, ID_USER) D
on C.RN+1=D.RN
and C.Data=D.Data
WHERE mod(C.RN,2)=1;
给我们:
+----+---------+-------+---------+---------+---------------------+
| | ID_USER | Total | ID_USER | Total_1 | data |
+----+---------+-------+---------+---------+---------------------+
| 1 | 9 | 4,00 | 5 | 3,25 | 19.02.2018 00:00:00 |
| 2 | 9 | 1,50 | 5 | 1,00 | 20.02.2018 00:00:00 |
| 3 | 9 | 1,00 | 5 | 0,25 | 21.02.2018 00:00:00 |
+----+---------+-------+---------+---------+---------------------+
现在,如果给定数据可以有多个用户;在这种情况下,我需要了解你想要的结果。我们总是配对吗?那么,如果有3个ID_user且总数应该在具有相同数据的第二行上为空白? (如果是这样,只需将内连接更改为左连接)是否每个用户添加2个额外的列,一个用于ID_user,另一个用于总计? (如果是这样的话,我们现在在mySQL中有一个动态的交叉表查询,可以完成,但需要更多的编码。
通过在问题中添加其他样本数据并模拟此类数据的预期结果,以图形方式说明此类边缘情况。这可以通过编辑我提供的rextester示例或增强图形插图来完成。