案例列在oralce中排成一行

时间:2017-08-23 10:16:34

标签: oracle

  SELECT 
         t.LAST_NAME,

         MAX (
            CASE
               WHEN TSI.SERVICE = 1 THEN 'Short Course – Facilitation only'
            END)
            Col1,
         MAX (CASE WHEN TSI.UNIT = 1 THEN 'Dint' END) rate1,
         MAX (
            CASE
               WHEN TSI.SERVICE = 2 THEN 'Short Course – Assessment only'
            END)
            Col2,
         MAX (CASE WHEN TSI.UNIT = 3 THEN 'Dillnt' END) rate3,
         MAX (
            CASE WHEN TSI.SERVICE = 3 THEN 'Short Course – Assessment ' END)
            Col3


    FROM LMS$TRAINERS T
         JOIN
         trainer_service_info TSI
            ON     T.trainer_id = TSI.trainer_id
               AND COMPANY_ID = :P0_COMPANY_ID
               AND status = 'A'
GROUP BY t.TRAINER_ID,
         t.FIRST_NAME,
         t.LAST_NAME,
         t.ID_NUM,
         t.DATE_OF_BIRTH,
         t.CLOCK_NO,
         t.CONTACT_NO,
         TSI.Service,
         TSI.UNIT,
         TSI.RATE,
         t.language,
         t.rating,
         t.ID_TYPE,
         t.LMS_SPECIALITY_AREA,
         t.EMAIL_ADDRESS,
         t.STATUS_REASON,
         t.DEFAULT_BRANC_ID

以上代码生成 - 修剪以便于演示

Name   Col1                Rate1     Col2               Rate3
Maruma Facilitation only    Dint                
Maruma                               Assessment only    Dillnt  

希望它产生

Name   Col1                Rate1     Col2               Rate3   
Maruma Facilitation only    Dint    Assessment only     Dillnt

1 个答案:

答案 0 :(得分:0)

目前,您的分组列表是一个巨大的列列表:

     t.TRAINER_ID,
     t.FIRST_NAME,
     t.LAST_NAME,
     t.ID_NUM,
     t.DATE_OF_BIRTH,
     t.CLOCK_NO,
     t.CONTACT_NO,
     TSI.Service,
     TSI.UNIT,
     TSI.RATE,
     t.language,
     t.rating,
     t.ID_TYPE,
     t.LMS_SPECIALITY_AREA,
     t.EMAIL_ADDRESS,
     t.STATUS_REASON,
     t.DEFAULT_BRANC_ID

它不需要,并且正在导致这个"问题"。更改您的GROUP BY,以便您只对t.LAST_NAME进行分组(您的选择列表中唯一未包含在聚合表达式中的成员)

否则,在您存在某些笛卡尔积的情况下,您将对其他值进行分组

警告:这意味着您可能最终丢失或混合数据 - 目前有两行具有相同的姓氏但其他一些细节不同,例如可能是名字。 MAX()表达式不会尝试保持同一行的数据。这意味着如果您有例如两个人,Sarah Maruma,38岁,住在阿富汗,John Maruma,19岁,住在津巴布韦,你最终会得到一系列混合价值观:

Maruma,38岁,津巴布韦

如果可以,那就破解吧。如果这不是正常的,那么将当前在您的组中的每一列也放入您的选择列表中,并查看结果。找出变化发生的位置,并决定你想要做些什么

通常,您应该最终得到一个查询,其中GROUP BY中的所有列也列在SELECT中(不在任何聚合函数中)