Hola
encuentro muy logica tu idea, en un principio lo habia echo asi, pero involucra mas lineas de codigo... y el objetivo era realizarlo de la forma mas eficiente y usando referencia cruzada y una sola consulta sql, es por ello que lo hize asi
el unico detalle y es para este caso en especifico es lo de la fecha que la devuelve como caracter y no como fecha, pero en el caso de que estes ordenando por numero o varchar funciona correctamente
Código:
select codigo
sum(date*(1-abs(sign(id-1)))) as prod1,
sum(date*(1-abs(sign(id-2)))) as prod2,
sum(date*(1-abs(sign(id-3)))) as pord3
from tabla2_ group by codigo
saludos