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
目前,您的分组依据是一个巨大的列列表:
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(( 表达式不会尝试保留同一行中的数据。这意味着,如果你有两个人,38岁的莎拉·马鲁玛(Sarah Maruma(住在阿富汗,约翰·马鲁马(John Maruma(19岁,住在津巴布韦,你最终会得到一排混合价值观:
Maruma, 38, 津巴布韦
如果这没问题,那就继续吧。如果这不行,则将当前在分组依据中的每一列也放入您的选择列表中,并查看结果。找出变体发生的位置并决定您要采取的操作
通常,您应该最终得到一个查询,其中 GROUP BY 中的所有列也列在 SELECT 中(而不是在任何聚合函数中(