如何将两个不同的行分组为一个匹配结果

问题描述 投票:0回答:1

我必须编写一个查询来形成条形图。在条形图中,x 轴应根据日期时间 (dateValue) 进行分组,y 轴应具有数字总和 (stringValue)。这两个字段都是我的 task_project_field 表中的自定义字段,该表有两个该值的条目。如何实现可以根据日期时间和数字进行分组的结果

我想按月分组。假设 2024 年 5 月,并对所有字符串值求和,假设为 (900)。这两个值都位于两个不同的 field_id(field_id 371 和 349)中,如表所示。

这是我的询问:

SELECT t.id,
  CONCAT(MONTHNAME(tpf.dateValue), '-', year(tpf.dateValue)) as month,
  t.task_name,
  tm.project_id,
  tm.team_id,
  tpf.field_id,
  tpf.dateValue,
  tpf.stringValue
FROM task as t
  inner join task_membership tm on t.id = tm.task_id
    and tm.deleted_at = 0
    and t.deleted_at = 0
  left join task_project_field as tpf on t.id = tpf.task_id
    and tpf.deleted_at = 0
WHERE (
    tpf.field_id = 371
    or tpf.field_id = 349
  )
AND t.id in (2981641);

这是我的桌子:

SAMPLE TABLE

期望的结果:

Expected desired result

sql mysql group-by mariadb bar-chart
1个回答
0
投票

从您共享的 SQL 向后工程表,看起来您有一个 EAV 设计。本质上,您的

task_project_field
表中存储了多个键/值。在这种情况下
field_id
/
string/date_value

处理此问题的最佳方法是

LEFT OUTER JOIN
到您的
task_project_field
表中查找您想要抓取的每个
field_id
。否则你最终需要聚合,事情会变得丑陋。

考虑:

SELECT t.id,
  CONCAT(MONTHNAME(tpf349.dateValue), '-', year(tpf349.dateValue)) as displayKey,
  tpf371.stringValue as countsum
FROM task as t
  inner join task_membership tm on t.id = tm.task_id
    and tm.deleted_at = 0
    and t.deleted_at = 0
  left join task_project_field as tpf371 on t.id = tpf371.task_id
    and tpf371.deleted_at = 0
    and tpf371.field_id = 371
  left join task_project_field as tpf349 on t.id = tpf349.task_id
    and tpf349.deleted_at = 0
    and tpf349.field_id = 349

在这里,我们根据我们感兴趣的

tpf
连接两次,为
field_id
别名。我们还在连接标准中包含一个新条件,以指定我们想要用于此特定连接的
field_id

+---------+------------+----------+
|   id    | displayKey | countsum |
+---------+------------+----------+
| 2981641 | April-2024 |      900 |
| 2981642 | June-2024  |   123456 |
| 2981643 | May-2024   |     8900 |
| 2981644 | June-2024  |       90 |
| 2981645 | May-2024   |       16 |
+---------+------------+----------+

此输出基于您共享的初始屏幕截图“输出”。

你可以在这个 dbfiddle 看到它的实际效果。

© www.soinside.com 2019 - 2024. All rights reserved.