繁体   English   中英

两组同查询Mysql

[英]Two group in the same Query Mysql

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

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

预期的:

图片

图片

您的查询是无效的 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;

如果我们可以假设:(但很可能我不明白这个问题)

  • 每个数据总是只有两个 user_ID
  • 较高的 user_ID 应始终与较低的 userID 一起出现在 ID_User 列中...

那么以下应该工作:

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

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 和 total 在具有相同数据的第二行上应该是空白的? (如果是这样,只需将内连接更改为左连接)是否应该为每个用户添加 2 个额外的列,一个用于 ID_user,一个用于总计? (如果是这样,我们现在在 mySQL 中有一个动态交叉表查询,它可以完成,但需要更多的编码。

通过向您的问题添加额外的示例数据并模拟此类数据的预期结果,以图形方式说明此类边缘情况。 这可以通过编辑我提供的 reextester 示例或增强您的图形插图来完成。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM