Как я могу создать свой SQL-код ниже в цикле, чтобы мне не нужно писать несколько строк кода - PullRequest
0 голосов
/ 18 октября 2019

У меня есть две таблицы:

table1
    id
    amount

table2
    id
    col1
    col2
    col3
    col4
    col5

И этот SQL:

select 
    t2.col1/t1.amount as col1,
    (t2.col1 + t2.col2)/t1.amount as col2,
    (t2.col1 + t2.col2 + t2.col3)/t1.amount as col3,
    (t2.col1 + t2.col2 + t2.col3 + t2.col4)/t1.amount as col4,
    (t2.col1 + t2.col2 + t2.col3 + t2.col4 + t2.col5)/t1.amount as col5
from table1 t1
inner join table2 t2 on t2.id = t1.id

Я хочу создать цикл для вышеуказанной функции, поэтому мне не нужно писать выборвыписка за 90 месяцев. Как я могу это сделать?

пример:

Текущая таблица

Table 1         Table 2             
**Amount      1   2   3   4   5**
100        10  10  10  10  10
200         20  20  20  20  20

Ожидаемый результат

**1   2   3   4   5**
10% 20% 30% 40% 50%
10% 20% 30% 40% 50%

1 Ответ

0 голосов
/ 28 октября 2019

Если вы действительно застряли с этим разбитым макетом таблицы для 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, если вам действительно это нужно, что обычно лучше всего обрабатывается в вашем клиентском коде или инструменте отчетности.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...