Если вы действительно застряли с этим разбитым макетом таблицы для 90 столбцов, вы можете вручную записать длинную версию этого выражения:
coaelsce(col1,0) + coalesce(col2, 0) + ... + coalesce(col90,0)
Использование объемных столбцовкак будто это не очень хороший дизайн базы данных, и, следовательно, база данных не поддерживает его с каким-либо простым синтаксисом, который позволил бы вам писать что-нибудь короче.
Единственное, что вы можете сделать, это создать View , чтобы имитировать лучший дизайн таблицы, но код для этого все еще будет довольно уродливым и SLOW (хотя индексированное / материализованное представление может ускорить его).
Для этого вам нужно начать с таблицы numbers
, содержащей значения от 1 до 90:
CREATE View BetterTable2 As
SELECT t2.id, n.number As ColNumber
CASE n.number
WHEN 1 THEN t2.col1
WHEN 2 THEN t2.col2
WHEN 3 THEN t2.col3
-- ...
WHEN 90 THEN t2.col90
ELSE NULL END As ColValue
FROM numbers n
INNER JOIN table2 t2 ON n.number >= 1 and n.number <= 90
Вы также можете видеть, что нам все еще нужно перечислить все столбцы вручную,но если вам действительно нужен промежуточный итог, он, по крайней мере, сделает это возможным, поэтому вам нужно выписать каждый из этих столбцов один раз .
Теперь вы можете дополнительно написать запроскак это:
SELECT t2_0.id, t2_0.ColNumber,
SUM(t2_1.ColValue)/t1.amount As Percent
FROM Table1 t1
INNER JOIN BetterTable2 t2_0 ON t2_0.id = t1.id
INNER JOIN BetterTable2 t2_1 ON t2_1.id = t2_0.id AND t2_1.ColNumber <= t2_0.ColNumber
GROUP BY t2_0.id, t2_0.ColNumber, t1.amount
И отсюда вы можете сделать PIVOT
, если вам действительно это нужно, что обычно лучше всего обрабатывается в вашем клиентском коде или инструменте отчетности.