#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