Twoja metoda jest całkiem rozsądna. Dobry chwyt na nullif() w sum() , przy okazji. Chociaż else klauzula jest obliczane tylko po then , składniki else są obliczane podczas agregacji — więc log(0) zwróci błąd.
Myślę, że istnieje kilka prostszych sposobów obliczania znaku, takich jak:
power(-1, sum(case when column1 < 0 then 1 else 0 end))
lub:
(case when sum(case when column1 < 0 then 1 else 0 end) % 2 = 0 then 1 else -1 end)
Jednak to, która wersja jest „prostsza”, jest kwestią opinii.