Как улучшить оператор CASE WHEN, чтобы он возвращал результат в той же строке - PullRequest
0 голосов
/ 17 апреля 2019

В настоящее время работает над некоторым сценарием SQL из базы данных прогресса OpenEdge. В данный момент я пытаюсь вернуть время для события, основываясь на том, было ли оно Estimated или Actual. Это можно определить с помощью результата в столбце. Проблема, которую я получаю, заключается в том, как работают данные, они показывают то же самое EveNumber, но в двух строках (одна для оценочной, другая для фактической). Я хотел бы объединить эти строки в один.

Я попробовал приведенный ниже код, но я получил результат, состоящий из двух отдельных строк. Я попытался поместить случай, когда тоже в раздел Else, но это не сработало. Ниже мой сокращенный код:

SELECT 

Event_0.EveNumber
, (CASE WHEN Object_0.ObjName = '818 Artwork typeset duration' THEN TemplateRunObject_0.TroValue ELSE NULL END) AS 'Actual'
, (CASE WHEN Object_0.ObjName = '818 Artwork Estimated typeset duration' THEN TemplateRunObject_0.TroValue ELSE NULL END) AS 'Estimated'

FROM 
SBS.PUB.Event Event_0
LEFT JOIN SBS.PUB.TemplateRunObject TemplateRunObject_0 ON Event_0.TemplateRunID = TemplateRunObject_0.TemplateRunID 
JOIN SBS.PUB.Object Object_0 ON TemplateRunObject_0.ObjectId = Object_0.ObjectId

Оригинальное расположение данных

Evenumber             Ogjname                              TroValue
123          818 Artwork typeset duration                     15
123          818 Artwork Estimated typeset duration           30

В настоящее время результаты выглядят так:

EveNumber          Actual          Estimated
123                 15                0
123                  0                30

Как я хочу, чтобы они появились

EveNumber          Actual          Estimated
123                 15                30

Ответы [ 2 ]

1 голос
/ 17 апреля 2019

Это поможет вам; Функция MAX (). Но вы должны забыть GROUP BY.

   SELECT Event_0.EveNumber
    , (MAX(CASE WHEN Object_0.ObjName = '818 Artwork typeset duration' THEN TemplateRunObject_0.TroValue ELSE NULL END)) AS 'Actual'
    , (MAX(CASE WHEN Object_0.ObjName = '818 Artwork Estimated typeset duration' THEN TemplateRunObject_0.TroValue ELSE NULL END)) AS 'Estimated'
    FROM 
    SBS.PUB.Event Event_0
    LEFT JOIN SBS.PUB.TemplateRunObject TemplateRunObject_0 ON Event_0.TemplateRunID = TemplateRunObject_0.TemplateRunID 
    JOIN SBS.PUB.Object Object_0 ON TemplateRunObject_0.ObjectId = Object_0.ObjectId
    GROUP BY Event_0.EveNumber
1 голос
/ 17 апреля 2019

использовать max() и группировать по

SELECT 

Event_0.EveNumber
, max((CASE WHEN Object_0.ObjName = '818 Artwork typeset duration' THEN TemplateRunObject_0.TroValue ELSE NULL END) ) AS 'Actual'
,max( (CASE WHEN Object_0.ObjName = '818 Artwork Estimated typeset duration' THEN TemplateRunObject_0.TroValue ELSE NULL END) )AS 'Estimated'

FROM 
SBS.PUB.Event Event_0
LEFT JOIN SBS.PUB.TemplateRunObject TemplateRunObject_0 ON Event_0.TemplateRunID = TemplateRunObject_0.TemplateRunID 
JOIN SBS.PUB.Object Object_0 ON TemplateRunObject_0.ObjectId = Object_0.ObjectId
group by  Event_0.EveNumber
...