两个组在同一个Query Mysql中

时间:2018-02-21 12:34:14

标签: mysql group-by

我有一个表(服务),其中包含执行它的人的ID以及服务的价值和完成日期。 我需要在同一行上按日期和ID添加服务的价值。 有可能吗?

SELECT sum(value) as total, id_user, data FROM os GROUP by data

预期:

img

img

2 个答案:

答案 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)

如果我们可以假设:(但我可能会很好地理解这个问题)

  • 每个数据始终只有两个user_ID
  • 较高的user_ID应始终显示在ID_User列中,且IDID较低...

然后以下内容应该有效:

  • 生成两个我们可以连接在一起的数据相同的集合(下面的C,D)
  • 在每个数据集中,将相同的rownumber分配给有序序列,在这种情况下,我们按数据和ID_User排序
  • 现在在生成的RN + 1和RN上加入这些数据集,以便集合C中的第1行与集合D的第2行绑定
  • 现在将集合C限制为仅包含奇数行,因此集合D将只有偶数行。如果假设为真,并且每个数据只有2个用户,那么我们将得到所需的结果。

Working Demo on Rextester

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示例或增强图形插图来完成。