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
答案 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中(不在任何聚合函数中)