Как улучшить оператор CASE WHEN для возврата результата в той же строке

#sql #excel #openedge #progress-db #ms-query

#sql #excel #openedge #прогресс-db #ms-запрос

Вопрос:

В настоящее время работаю над некоторым SQL-скриптом из базы данных OpenEdge progress. В данный момент я пытаюсь вернуть время для события , основываясь на том , было ли это 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
 

Комментарии:

1. вы можете использовать функцию Coalesce, перейдя по этой ссылке https://www.1keydata.com/sql/sql-coalesce.html

Ответ №1:

используйте 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
 

Ответ №2:

Это поможет вам; Функция 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