【问题标题】:How to improve CASE WHEN statement to return result on same line如何改进 CASE WHEN 语句以在同一行返回结果
【发布时间】:2019-09-07 10:41:41
【问题描述】:

目前正在处理来自 OpenEdge 进度数据库的一些 SQL 脚本。目前,我正在尝试根据事件是 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

【问题讨论】:

标签: sql excel openedge progress-db ms-query


【解决方案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
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2021-02-09
      • 2013-04-23
      • 1970-01-01
      • 2022-01-17
      • 1970-01-01
      • 1970-01-01
      • 2022-06-17
      相关资源
      最近更新 更多