2017-02-16 26 views
0

У меня есть неэлегантное решение для поворота запроса SELECT в MySQL с использованием функций CASE, которые я использовал ранее, но не могу видеть, где я могу ошибиться, поскольку я не получаю ожидаемых результатов , В попытке передать мои намерения:Сводка с футляром и группой

Я пытаюсь отслеживать ход штампов времени для уникальной ссылки, которую я могу легко вытащить в запросе 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 

Это относительный образец, в то время как другие примеры, с которыми я работаю, имеют разные значения спорадически во всех операциях CASE a-g. Я смотрю на многие источники, и кажется, что агрегаты GROUP не помещаются с NULL, но я не могу найти хороший конкретный пример или объяснение, чтобы позволить мне получить то, в чем я нуждаюсь: одна строка, с результатом, вырванным из CASE в отдельных столбцах, где возвращаемое значение равно NULL (или '') до замены при создании записи даты. Это также необходимо сделать в выбранном запросе без удобства просто реорганизовать данные в более подходящие реляционные таблицы.

Также, если это имеет значение, этот пример должен быть разрешен, как описано, но знайте, что он также будет соединен UNION с дополнительными значениями c.ID.

Любая помощь или руководство были бы очень благодарны, даже если это просто указать, что я собираюсь сделать это совершенно неправильно.

+0

Я думаю, один из этих вопросов должно помочь: [1] (http://stackoverflow.com/questions/29360052/ use-coalesce-or-something-like-it-with-group-by-in-sql-server), [2] (http://stackoverflow.com/questions/11418870/sql-ugly-combination-of-group -by-and-coalesce) – yeputons

+0

tl; dr: вы можете использовать подзапросы, чтобы находить значения 'a' и т. д .; вы можете попробовать использовать агрегатные функции, такие как 'max' на столбцах' a', 'b', ..., чтобы найти некоторую непустую дату. – yeputons

ответ

1

Добавление GROUP c.ID к текущему запросу в одиночку не имеет никакого логического смысла, и не будет работать даже в большинстве баз данных, потому что как только вы укажете GROUP BY, вы сообщаете базу данных для агрегатных группы записей. Следовательно, каждый выбранный вами столбец должен быть либо самой группой (то есть нормально выбрать c.ID) или должен включать некоторую функцию агрегации, такую ​​как MAX() или SUM().

SELECT c.ID, 
     d.lead_id, 
     MAX(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, 
     MAX(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, 
     MAX(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, 
     MAX(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, 
     MAX(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, 
     MAX(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, 
     MAX(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 
INNER JOIN stream s 
    ON s.object_id = d.lead_id 
INNER 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 
GROUP BY c.ID 

Вот краткая схема, показывающая, как 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 
+1

Очень ценится. Я могу сделать эту работу. Вы правы в своем ошибочном предположении и использовании GROUP c.ID, это был взлом и косая попытка большего, прежде чем было принято решение использовать UNION для получения нескольких результатов. Ваш конкретный пример дает именно то, о чем я просил, - большое спасибо, и я надеюсь, что это поможет кому-то другому. –