Mysql 以案例和小组为中心

Mysql 以案例和小组为中心,mysql,group-by,case,Mysql,Group By,Case,我有一个不雅观的解决方案,可以使用我以前使用过的CASE函数在MySQL中旋转SELECT查询,但是我看不出哪里会出错,因为我没有得到预期的结果。为了传达我的意图: 我正在尝试跟踪时间戳的进度,以获得一个唯一的引用,我可以轻松地在SELECT查询中提取该引用,但需要将它们转为行。我通过以下查询完成了此操作: SELECT c.ID, d.lead_id, CASE WHEN s.summary LIKE '%submitted and status set to "Pending FA Appr

我有一个不雅观的解决方案,可以使用我以前使用过的CASE函数在MySQL中旋转SELECT查询,但是我看不出哪里会出错,因为我没有得到预期的结果。为了传达我的意图:

我正在尝试跟踪时间戳的进度,以获得一个唯一的引用,我可以轻松地在SELECT查询中提取该引用,但需要将它们转为行。我通过以下查询完成了此操作:

SELECT c.ID, d.lead_id,
CASE WHEN s.summary LIKE '%submitted and status set to "Pending FA Approval"%' THEN DATE_FORMAT(CONVERT_TZ (s.created,'+00:00','-06:00'), '%M %e, %Y [%h:%i %p]') END AS a,
CASE WHEN s.summary LIKE '%("Pending FA Approval" => "Not Approved, Please Revise")%' THEN DATE_FORMAT(CONVERT_TZ (s.created,'+00:00','-06:00'), '%M %e, %Y [%h:%i %p]') END AS b,
CASE WHEN s.summary LIKE '%("Not Approved, Please Revise" => "Pending FA Approval")%' THEN DATE_FORMAT(CONVERT_TZ (s.created,'+00:00','-06:00'), '%M %e, %Y [%h:%i %p]') END AS c,
CASE WHEN s.summary LIKE '%("Pending FA Approval" => "Complete, Pending Payment")%' THEN DATE_FORMAT(CONVERT_TZ (s.created,'+00:00','-06:00'), '%M %e, %Y [%h:%i %p]') END AS d,
CASE WHEN s.summary LIKE '%("Complete, Pending Payment" => "Paid, Complete")%' THEN DATE_FORMAT(CONVERT_TZ (s.created,'+00:00','-06:00'), '%M %e, %Y [%h:%i %p]') END AS e,
CASE WHEN s.summary LIKE '%("Paid, Complete" => "Processing")%' THEN DATE_FORMAT(CONVERT_TZ (s.created,'+00:00','-06:00'), '%M %e, %Y [%h:%i %p]') END AS f,
CASE WHEN s.summary LIKE '%("Paid, Complete" => "Processed")%' THEN DATE_FORMAT(CONVERT_TZ (s.created,'+00:00','-06:00'), '%M %e, %Y [%h:%i %p]') END AS g
FROM lead_detail d
JOIN stream s ON s.object_id = d.lead_id
JOIN chapter c ON c.ID = d.`value`
WHERE d.field_number = 41
AND s.created >= "2017-02-15"
AND s.action = "status-change"
AND s.summary NOT LIKE "%Voided%"
AND c.ID = 549
这将返回以下内容:

 ID     |   lead_id |   a                           |   b       |   c       |   d                           |   e       |   f       |   g
 549    |   14512   |   February 15, 2017 [08:53 PM]|   NULL    |   NULL    |   NULL                        |   NULL    |   NULL    |   NULL
 549    |   14512   |   NULL                        |   NULL    |   NULL    |   February 15, 2017 [08:54 PM]|   NULL    |   NULL    |   NULL
我的问题是,当我通过将
GROUP by c.ID
附加到查询末尾进行聚合时,我得到:

 ID     |   lead_id |   a                           |   b       |   c       |   d       |   e       |   f       |   g
 549    |   14512   |   February 15, 2017 [08:53 PM]|   NULL    |   NULL    |   NULL    |   NULL    |   NULL    |   NULL
而不是我所期待的:

 ID |   lead_id |   a                           |   b       |   c       |   d                           |   e       |   f       |   g
549 |   14512   |   February 15, 2017 [08:53 PM]|   NULL    |   NULL    |   February 15, 2017 [08:54 PM]|   NULL    |   NULL    |   NULL
这是一个相对的示例,而我正在处理的其他示例在整个案例陈述a-g中偶尔会有不同的值。我查看了许多源代码,似乎组聚合不能很好地使用NULL,但我找不到一个好的具体示例或解释来让我得到我需要的:一行,结果从单独列中的CASE语句中提取,其中返回值为NULL(或“”),直到创建日期条目时被替换。这也需要在select查询中完成,而不需要将数据重新组织为更适合的关系表

另外,如果这很重要,这个例子需要按照前面的解释来解决,但是要知道它也将通过UNION连接到其他c.ID值


任何帮助或指导都将不胜感激,即使只是指出我的做法完全错误。

仅向当前查询添加
GROUP c.ID
没有任何逻辑意义,甚至不会在大多数数据库中运行,因为只要指定
GROUP BY
,您正在告诉数据库聚合记录组。因此,您选择的每一列都必须是组本身(即可以选择
c.ID
),或者必须包含一些聚合函数,例如
MAX()
SUM()

下面是一个简图,显示了
MAX()
如何使枢轴工作

id | col
1  | 2         <-- the max of col when id=1 is 2, because NULLs are ignored
1  | NULL
1  | NULL
2  | NULL
2  | 5         <-- the max of col when id=2 is 5, because NULLs are ignored
2  | NULL
id|col

1 | 2我认为其中一个问题应该有所帮助:,tl;dr:您可以使用子请求查找
a
等的值;您可以尝试在
a
b
、上使用聚合函数,如
max
。。。列以查找一些非空日期。非常感谢。我能做到。我错误地假设和使用c.ID组是正确的,在决定使用UNION获得多个结果之前,这是一次更大的尝试。你的具体例子正好提供了我所要求的——非常感谢,我希望这对其他人有所帮助。
id | col
1  | 2         <-- the max of col when id=1 is 2, because NULLs are ignored
1  | NULL
1  | NULL
2  | NULL
2  | 5         <-- the max of col when id=2 is 5, because NULLs are ignored
2  | NULL